2016-10-22 2 views
1

Когда я отлаживаю свою программу, которая состоит из нескольких циклов записи нескольких векторов в векторах, она просто замораживает программу, но не предоставляет никаких сообщений об ошибках вообще. Есть ли у Visual Studio какой-то автоматический тайм-аут, который я испытываю?Visual Studio Time Out

ответ

0

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

И да нет времени для Visual Studio, но для окна программы. Это называется статусом зависания. Когда приложение (или, точнее, поток) создает окно на рабочем столе, оно вступает в неявный контракт с диспетчером окон рабочего стола (DWM) для своевременного обработки оконных сообщений. DWM отправляет сообщения (ввод клавиатуры/мыши и сообщения из других окон, а также сам) в очередь сообщений, зависящую от потока. Поток получает и отправляет эти сообщения через свою очередь сообщений. Если поток не обслуживает очередь, вызывая GetMessage(), сообщения не обрабатываются, и окно зависает: оно не может ни перерисовывать, ни принимать данные от пользователя. Операционная система обнаруживает это состояние, подключая таймер к ожидающим сообщениям в очереди сообщений. Если сообщение не было восстановлено в течение 5 секунд, DWM объявит окно висящим. Вы можете запросить это состояние окна через API IsHungAppWindow().

Обнаружение - это только первый шаг. На этом этапе пользователь по-прежнему не может даже завершить работу приложения - нажатие кнопки X (Close) приведет к сообщению WM_CLOSE, которое будет застревать в очереди сообщений точно так же, как и любое другое сообщение. Диспетчер окон рабочего стола помогает легко скрывать, а затем заменять висящее окно копией «призрак», отображая растровое изображение предыдущей клиентской области исходного окна (и добавляя «Не реагировать» в строку заголовка). Пока поток исходного окна не извлекает сообщения, DWM управляет обоими окнами одновременно, но позволяет пользователю взаимодействовать только с призрачной копией. Используя это окно-призрак, пользователь может только перемещать, сводить к минимуму и, самое главное, закрывать невосприимчивое приложение, но не изменять его внутреннее состояние.

Хорошая статья написана по следующей ссылке. How program window works