Организация отображения прогресса
От: Аноним  
Дата: 01.06.04 08:44
Оценка:
Есть сди приложение. В нем выполняются длительные по времени операции (вроде обработки содержимого файла).
В следствие этого возникает необходимость отображения прогресс бара.
Я его запихал в статус бар.
Все вроде бы классно, но возникает проблема:
во время выполнения этой самой процедуры, все окно застывает. Нет никакого его обновления и зачастую изображение в нем совсем пропадает (окно видимо не успевает отрисоваться).
Расскажите, пожалуйста как эта проблема обходится?
Re: Организация отображения прогресса
От: vyuvwork  
Дата: 01.06.04 09:16
Оценка:
Здравствуйте, <Аноним>, Вы писали:

А>Есть сди приложение. В нем выполняются длительные по времени операции (вроде обработки содержимого файла).

А>В следствие этого возникает необходимость отображения прогресс бара.
А>Я его запихал в статус бар.
А>Все вроде бы классно, но возникает проблема:
А>во время выполнения этой самой процедуры, все окно застывает. Нет никакого его обновления и зачастую изображение в нем совсем пропадает (окно видимо не успевает отрисоваться).
А>Расскажите, пожалуйста как эта проблема обходится?
Наверно надо использовать потоки для выполнения этих операций.
... << RSDN@Home 1.1.3 stable >>
Re[2]: Организация отображения прогресса
От: Аноним  
Дата: 01.06.04 09:59
Оценка:
Здравствуйте, vyuvwork, Вы писали:

V>Наверно надо использовать потоки для выполнения этих операций.

Дело в том, что в этой длительной операции происходит кроме всего прочего занесение информации в элементы управления.
А в основном потоке тоже происходит с ними взаимодействие. Так что по-любому придется ожидать завершения этой нити.
Как тогда во время ожидания обновлять окно?
Re[3]: Организация отображения прогресса
От: SchweinDeBurg Россия https://zarezky.spb.ru/
Дата: 01.06.04 10:13
Оценка: +1
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, vyuvwork, Вы писали:


V>>Наверно надо использовать потоки для выполнения этих операций.

А>Дело в том, что в этой длительной операции происходит кроме всего прочего занесение информации в элементы управления.
А>А в основном потоке тоже происходит с ними взаимодействие. Так что по-любому придется ожидать завершения этой нити.
А>Как тогда во время ожидания обновлять окно?

Если Ваша "длительная" операция циклична, то на каждой итерации можно производить выборку из очереди и диспетчеризацию сообщений — Peek/Translate/Dipatch Message.
- Искренне ваш, Поросенок Пафнутий
Re[3]: Организация отображения прогресса
От: Аноним  
Дата: 01.06.04 10:15
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте, vyuvwork, Вы писали:


V>>Наверно надо использовать потоки для выполнения этих операций.

А>Дело в том, что в этой длительной операции происходит кроме всего прочего занесение информации в элементы управления.
А>А в основном потоке тоже происходит с ними взаимодействие. Так что по-любому придется ожидать завершения этой нити.
А>Как тогда во время ожидания обновлять окно?

Ну можно по событию таймера проверять окончание выполнения потока, можно просто по окончании послать сообщение из этого потока главному,
вариантов море
Re[3]: Организация отображения прогресса
От: Kalinsky V. http://www.promzona.design.ru
Дата: 01.06.04 10:16
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как тогда во время ожидания обновлять окно?


Попробуй сделать так: в рабочий поток передавай hwnd окна-владельца progressbar-a, и из него шли сообщения о необходимости подвинуть прогресс. Только не очень часто
Можно еще организовать прогресс без потоков, только во время выполнения нужно крутить цикл выборки сообщений.
Цель деятельности всех программистов – чтобы их деятельность стала не нужна.
Re: Организация отображения прогресса
От: screw_cms Россия ICQ: 168185721
Дата: 01.06.04 10:43
Оценка: 2 (1)
Здравствуйте, Аноним, Вы писали:

А>во время выполнения этой самой процедуры, все окно застывает. Нет никакого его обновления и зачастую изображение в нем совсем пропадает (окно видимо не успевает отрисоваться).


Застывает окно потому что основной поток приложения перестаёт выгребать сообщения из очереди. В обработчике длительного события необходимо либо достаточно оперативно самому выгребать сообщения, либо запускать обработку в отдельном потоке. При работе с несолькими потоками ни в коем случае не забываем о объектах синхронизации.
Из того что для каждого окна необходимо иметь поток получаем следующую (примерную) схему работы. Допустим, у нас есть приложение. Мы хотим запустить долгосрочную операцию, отображать ход прогресса с возможностью отмены операции в отдельном окне, и вместе с тем продолжить работу в основном приложении. В обработчике события запуска долгосрочной операции создаём окно и возвращаем управление приложению. В классе окна прогресса создаём поток "оживляющий" это окно. Там же создаём собственно рабочий поток, с которым синхронизируемя, через, например, семафор. Вуаля.
When in doubt, use brute force. © Ken Thompson

 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.