Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Последние темы форума

Показать новые сообщения »

Почтовая рассылка

Подписчиков: 11850
Последний выпуск: 19.06.2015

Индикатор выполнения процесса

283
19 апреля 2013 года
plastictown
298 / / 08.01.2006
Доброго времени суток! Пишу программу, в которой есть процедура для чтения/ парсинга бинарного файла. Процесс занимает некоторое время и мне бы хотелось создать индикатор выполнения, но при запуске процедуры окно не реагирует ни на что никак. Строку состояния нарисовал сам, мне так больше нравится. Хочу просто зеленый прямоугольник, нарисованный на GDI, который движется по ходу выполнения. Изнутри процедуры посылаю в окно сообщение WM_PROGRESS, в аргументах сколько нужно обработать и сколько сделано. Как заставить ожить все это дело? Не в другом же потоке запускать в самом деле.

Заранее спасибо!
1.4K
19 апреля 2013 года
Meander
487 / / 04.09.2011
Чтение/парсинг и перерисовку по таймеру. Видимо окну нужно существенное время, чтобы перерисоваться. Если в другом потоке запускать, то таймером станет система, переключающаяся между потоками.
283
19 апреля 2013 года
plastictown
298 / / 08.01.2006
Цитата: Meander
Чтение/парсинг и перерисовку по таймеру. Видимо окну нужно существенное время, чтобы перерисоваться. Если в другом потоке запускать, то таймером станет система, переключающаяся между потоками.



Спасибо, буду пробовать.

Хотя с чего бы такому

Код:
CDialog::OnPaint();

    }

   // .......... CPaintDC dc(this) .................//

    CRect wnd; this->GetClientRect(&wnd);
    CRect r(wnd.left, wnd.bottom, wnd.right, wnd.bottom-GetStatusHeight());

    CBrush b(GetStatusColor());
    dc.SelectObject(&b);
    dc.Rectangle(&r);
    b.DeleteObject();

    dc.SelectObject(&m_statusFont);
    dc.SetTextColor(GetStatusTextColor()); 
    dc.SetBkColor(GetStatusColor());

    dc.TextOut((INT)(GetStatusHeight()/4),
        wnd.bottom-GetStatusHeight()+(INT)(GetStatusHeight()/8),
    GetStatusText());
   
}
коду долго рисоваться?
1.4K
19 апреля 2013 года
Meander
487 / / 04.09.2011
Думаю, что не коду долго рисоваться, а перерисовка окна стоит последней в очереди событий и ждет, пока не завершится процедура парсинга файла.
269
19 апреля 2013 года
sadovoya
757 / / 19.11.2005
Думаю, юзеру не понравится ситуация с помершим интерфейсом, даже если его пытаться успокоить прогрессом. Напрашивается решение с постановкой гуи в поток с добавлением кнопки завершения.
283
21 апреля 2013 года
plastictown
298 / / 08.01.2006
Цитата: sadovoya
Думаю, юзеру не понравится ситуация с помершим интерфейсом, даже если его пытаться успокоить прогрессом. Напрашивается решение с постановкой гуи в поток с добавлением кнопки завершения.


Не, это весьма полезно было бы, тока вся программа бессмысленна без этого парсинга и, если тупой юзер будет постоянно отменять процесс, зачем он ему тогда вообще нужна? Может ему показать сколько времени до конца? Рисовать в цикле, попробую. Жалко только портить замечательный сяшный код мерзким MFC:)

269
21 апреля 2013 года
sadovoya
757 / / 19.11.2005
Прервать программу -- неотъемлемое право юзера даже тупого :)
Да, и изящный сяшный код можно поместить в отдельный модуль, а гуевый отделить. Тогда можно повторно использовать. "Разделяй и властвуй" :)

Знаете кого-то, кто может ответить? Поделитесь с ним ссылкой.

Ваш ответ

Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог