Для Windows приложение обрабатывает перерисовку пользовательского интерфейса. Если программист использовал поток пользовательского интерфейса для выполнения вычислений, то вы застряли. Это не вина версии Windows, это не слишком элегантное программирование автора приложения. ;)
У Microsoft есть очень хорошая документация, описывающая описываемое вами явление и то, как программисты приложений могут его избежать.
Предотвращение зависаний в приложениях Windows
Вводная реклама:
Пользователи любят адаптивные приложения. Когда они щелкают меню, они хотят, чтобы приложение реагировало мгновенно, даже если оно в данный момент печатает их работу. Когда они сохраняют длинный документ в своем любимом текстовом редакторе, они хотят продолжать печатать, пока диск вращается. Пользователи быстро теряют терпение, когда приложение не реагирует своевременно на их ввод.
Программист может распознать множество законных причин, по которым приложение не реагирует мгновенно на ввод пользователя. Приложение может быть занято пересчетом некоторых данных или просто ожиданием завершения ввода-вывода. Тем не менее, из пользовательского исследования мы знаем, что пользователи раздражаются и расстраиваются после нескольких секунд безразличия. Через 5 секунд они попытаются завершить зависшее приложение. Помимо сбоев, зависания приложений являются наиболее распространенным источником нарушения работы пользователя при работе с приложениями Win32.
Рекламные проспекты:
Сохраняйте простой интерфейс
Основная обязанность потока пользовательского интерфейса - получать и отправлять сообщения. Любой другой вид работы представляет риск зависания окон, принадлежащих этой теме.
Делать:
- Перемещение ресурсоемких или неограниченных алгоритмов, которые приводят к длительным операциям, в рабочие потоки
- Определите как можно больше вызовов блокирующих функций и попытайтесь переместить их в рабочие потоки; любая функция, вызывающая другую DLL, должна вызывать подозрения
- Приложите дополнительные усилия для удаления всех вызовов файлового ввода-вывода и сетевых API из вашего рабочего потока. Эти функции могут блокироваться на много секунд, если не минут. Если вам нужно выполнить какой-либо ввод-вывод в потоке пользовательского интерфейса, рассмотрите возможность использования асинхронного ввода-вывода
- Помните, что ваш поток пользовательского интерфейса также обслуживает все однопоточные COM-серверы (STA), размещенные вашим процессом; если вы делаете блокирующий вызов, эти COM-серверы не будут отвечать до тех пор, пока вы снова не будете обслуживать очередь сообщений