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

Ваш аккаунт

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

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

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

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

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

Заранее спасибо!
446
19 апреля 2013 года
Meander
487 / / 04.09.2011
Чтение/парсинг и перерисовку по таймеру. Видимо окну нужно существенное время, чтобы перерисоваться. Если в другом потоке запускать, то таймером станет система, переключающаяся между потоками.
311
19 апреля 2013 года
plastictown
309 / / 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());
   
}
коду долго рисоваться?
446
19 апреля 2013 года
Meander
487 / / 04.09.2011
Думаю, что не коду долго рисоваться, а перерисовка окна стоит последней в очереди событий и ждет, пока не завершится процедура парсинга файла.
326
19 апреля 2013 года
sadovoya
757 / / 19.11.2005
Думаю, юзеру не понравится ситуация с помершим интерфейсом, даже если его пытаться успокоить прогрессом. Напрашивается решение с постановкой гуи в поток с добавлением кнопки завершения.
311
21 апреля 2013 года
plastictown
309 / / 08.01.2006
Цитата: sadovoya
Думаю, юзеру не понравится ситуация с помершим интерфейсом, даже если его пытаться успокоить прогрессом. Напрашивается решение с постановкой гуи в поток с добавлением кнопки завершения.


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

326
21 апреля 2013 года
sadovoya
757 / / 19.11.2005
Прервать программу -- неотъемлемое право юзера даже тупого :)
Да, и изящный сяшный код можно поместить в отдельный модуль, а гуевый отделить. Тогда можно повторно использовать. "Разделяй и властвуй" :)
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог