Есть сди приложение. В нем выполняются длительные по времени операции (вроде обработки содержимого файла).
В следствие этого возникает необходимость отображения прогресс бара.
Я его запихал в статус бар.
Все вроде бы классно, но возникает проблема:
во время выполнения этой самой процедуры, все окно застывает. Нет никакого его обновления и зачастую изображение в нем совсем пропадает (окно видимо не успевает отрисоваться).
Расскажите, пожалуйста как эта проблема обходится?
Здравствуйте, <Аноним>, Вы писали:
А>Есть сди приложение. В нем выполняются длительные по времени операции (вроде обработки содержимого файла). А>В следствие этого возникает необходимость отображения прогресс бара. А>Я его запихал в статус бар. А>Все вроде бы классно, но возникает проблема: А>во время выполнения этой самой процедуры, все окно застывает. Нет никакого его обновления и зачастую изображение в нем совсем пропадает (окно видимо не успевает отрисоваться). А>Расскажите, пожалуйста как эта проблема обходится?
Наверно надо использовать потоки для выполнения этих операций.
... << RSDN@Home 1.1.3 stable >>
Re[2]: Организация отображения прогресса
От:
Аноним
Дата:
01.06.04 09:59
Оценка:
Здравствуйте, vyuvwork, Вы писали:
V>Наверно надо использовать потоки для выполнения этих операций.
Дело в том, что в этой длительной операции происходит кроме всего прочего занесение информации в элементы управления.
А в основном потоке тоже происходит с ними взаимодействие. Так что по-любому придется ожидать завершения этой нити.
Как тогда во время ожидания обновлять окно?
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, vyuvwork, Вы писали:
V>>Наверно надо использовать потоки для выполнения этих операций. А>Дело в том, что в этой длительной операции происходит кроме всего прочего занесение информации в элементы управления. А>А в основном потоке тоже происходит с ними взаимодействие. Так что по-любому придется ожидать завершения этой нити. А>Как тогда во время ожидания обновлять окно?
Если Ваша "длительная" операция циклична, то на каждой итерации можно производить выборку из очереди и диспетчеризацию сообщений — Peek/Translate/Dipatch Message.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте, vyuvwork, Вы писали:
V>>Наверно надо использовать потоки для выполнения этих операций. А>Дело в том, что в этой длительной операции происходит кроме всего прочего занесение информации в элементы управления. А>А в основном потоке тоже происходит с ними взаимодействие. Так что по-любому придется ожидать завершения этой нити. А>Как тогда во время ожидания обновлять окно?
Ну можно по событию таймера проверять окончание выполнения потока, можно просто по окончании послать сообщение из этого потока главному,
вариантов море
Здравствуйте, Аноним, Вы писали:
А>Как тогда во время ожидания обновлять окно?
Попробуй сделать так: в рабочий поток передавай hwnd окна-владельца progressbar-a, и из него шли сообщения о необходимости подвинуть прогресс. Только не очень часто
Можно еще организовать прогресс без потоков, только во время выполнения нужно крутить цикл выборки сообщений.
Цель деятельности всех программистов – чтобы их деятельность стала не нужна.
Здравствуйте, Аноним, Вы писали:
А>во время выполнения этой самой процедуры, все окно застывает. Нет никакого его обновления и зачастую изображение в нем совсем пропадает (окно видимо не успевает отрисоваться).
Застывает окно потому что основной поток приложения перестаёт выгребать сообщения из очереди. В обработчике длительного события необходимо либо достаточно оперативно самому выгребать сообщения, либо запускать обработку в отдельном потоке. При работе с несолькими потоками ни в коем случае не забываем о объектах синхронизации.
Из того что для каждого окна необходимо иметь поток получаем следующую (примерную) схему работы. Допустим, у нас есть приложение. Мы хотим запустить долгосрочную операцию, отображать ход прогресса с возможностью отмены операции в отдельном окне, и вместе с тем продолжить работу в основном приложении. В обработчике события запуска долгосрочной операции создаём окно и возвращаем управление приложению. В классе окна прогресса создаём поток "оживляющий" это окно. Там же создаём собственно рабочий поток, с которым синхронизируемя, через, например, семафор. Вуаля.