Мое приложение - это оконное приложение, которое выполняет определенные сложные математические алгоритмы.Поскольку я начал работать с приложением очень давно, большая часть его все еще однопоточная.Чтобы быть более точным, основной поток выполняет всю сложную логику вычислений.Важно отметить, что во время вычислений я показываю некоторый прогресс на экране.
В большинстве случаев математические алгоритмы занимают всего несколько секунд, поэтому после того, как пользователь запустил действие, появятся песочные часы (илив Windows 7) отображается кружок, а через несколько секунд отображаются результаты.
В некоторых случаях алгоритм может занять несколько минут.В течение этого времени я показываю песочные часы, и пока алгоритм занят, я показываю прогресс в моем окне.Но если пользователь нажимает на приложение после того, как оно какое-то время было занято, окно становится «более белым» (как будто поверх окна накладывается не полностью прозрачный кусок пластика), окно больше не обновляется.и Windows сообщает, что «приложение не отвечает».
Я использую Qt и использую функцию Qt QWidget :: repaint, чтобы вызвать перерисовку, когда мой алгоритм занят.Перекраска работает некоторое время, но, как уже было сказано выше, Windows, кажется, через некоторое время блокирует это.
Как правильно сообщить Windows, что ваше приложение все еще занято и окно продолжает обновляться?Если я введу явный цикл обработки сообщений, пользователь может инициировать другие действия в приложении, которые мне не нужны.
- Достаточно ли вызвать PeekMessage?
- Достаточновызвать GetMessage?
- Или я должен вызвать DispatchMessage?И как мне запретить пользователю запускать другое действие (собственно, запретить весь ввод пользователя)
- Должен ли я вызывать одно из этих сообщений каждый раз, когда обновляю свое окно, или я могу ограничить себя, чтобы вызывать его каждые несколько секунд(10 секунд ?, 30 секунд? ...)
Обратите внимание, что перемещение логики вычислений в отдельный поток в настоящее время недоступно.
Я использую Visual Studio 2010в Windows 7 в сочетании с Qt 4.7.