Причина зависания этого приложения заключается в дизайне событий приложений Windows.
То, что происходит в фоновом режиме, любому приложению Windows не разрешается получать доступ к какому-либо аппаратному обеспечению, в отличие от операционной системы, которая может одновременно запускать только одну программу, например, DOS.Это необходимо для совместного использования оборудования, такого как видеокарта или мышь, между несколькими программами.Вместо прямого доступа к оборудованию, ядро Windows манипулирует самим оборудованием при запуске приложений, отправляющих ядру специальный запрос (системные вызовы), Win API фактически представляет собой набор функций, которые можно использовать для отправки такого запроса ядру.
Когда ваше приложение создает окно или рисует его, оно фактически запрашивает ядро операционной системы.Ядро выбирает, когда и как обрабатывать эту операцию, а затем использовать драйвер устройства видеокарты для рисования (поверх уровня аппаратной абстракции или специальных быстрых API, таких как OpenGL или Direct X и т. Д.).
Другое дело - как приложение будетзнать, если пользователь делает ввод с помощью мыши или клавиатуры.Windows хранит эти входные данные в специальной внутренней очереди структур, называемой событиями, у каждого потока приложения есть такая очередь.Само приложение должно иметь цикл, который ожидает событие ОС и реагирует на них - такие циклы называются циклом выполнения и обычно выглядят следующим образом:
MSG messages; // Here messages to the application are saved
// Run the message loop. It will run until GetMessage() returns 0
while (GetMessage (&messages, NULL, 0, 0))
{
/* Translate virtual-key messages into character messages */
TranslateMessage(&messages);
/* Send message to WindowProcedure */
DispatchMessage(&messages);
}
Если вы используете библиотеку, подобную MFC, этот цикл предоставляетсябиблиотекой, однако она все еще существует.Когда вы создали окно, вы или ваша библиотека - зарегистрировали функцию обратного вызова WindowProcedure
, эта функция реагирует на сообщения цикла выполнения, посылаемые объекту окна, например WM_PAINT.Такая функция обычно вызывает функцию DefWindowProc
, когда вашей программе не нужно обрабатывать какое-то конкретное событие.
WM_PAINT
происходит, когда вы максимизируете, минимизируете, восстанавливаете или отображаете скрытие окна, или вы можете отправить этосообщение в окно самостоятельно с помощью функции SendMessage.Если вы будете выполнять бесконечный цикл или блокируете поток, выполняющий цикл выполнения во время обработки сообщения, - он замораживает цикл выполнения, так как DefWindowProc или другая пользовательская обработка сообщений не будут вызываться, когда они должны быть вызваны, и ваше приложениезависает.
В статье MSDN показано, как создать анимацию, которую вы хотите реализовать.