Если MessageBox () / связанный синхронны, почему мой цикл сообщения не замораживается?

signed char имеет диапазон-128 к 127; unsigned char имеет диапазон от 0 до 255.

char будет эквивалентно или символу со знаком или неподписанному символу, в зависимости от компилятора, но отличный тип.

при использовании строк C-стиля, просто используйте char. Если необходимо использовать символы для (довольно редкой) арифметики, определите подписанный или неподписанный явно для мобильности.

12
задан 10 August 2009 в 20:14
поделиться

2 ответа

MessageBox () и аналогичные функции Windows API не блокируют выполнение, в отличие от операций ввода-вывода или мьютекса. Функция MessageBox () создает диалоговое окно, обычно с кнопкой OK, поэтому вы ожидаете автоматической обработки сообщений Windows, связанных с окном сообщения. Это реализовано с помощью собственного цикла сообщений - новый поток не создается, но ваше приложение остается отзывчивым, потому что выбранные сообщения, такие как Paint, обрабатываются рекурсивно, вызывая вашу функцию WndProc () , а некоторые сообщения не передаются, из-за модального типа созданного окна.

Sleep () и другие функции, вызываемые непосредственно из вашего WndProc () , обрабатывающего сообщение Windows,

10
ответ дан 2 December 2019 в 21:44
поделиться

MessageBox запускает собственный цикл сообщений Win32 (чтобы не замораживать вызывающее приложение).

Остерегайтесь использовать его в функциях без повторного входа ...

РЕДАКТИРОВАТЬ: для уточнения: Цикл сообщений в окнах выглядит примерно так (украдено из msdn):

while( (bRet = GetMessage( &msg, NULL, 0, 0 )) != 0)
{ 
    if (bRet == -1)
    {
        // handle the error and possibly exit
    }
    else
    {
        TranslateMessage(&msg); 
        DispatchMessage(&msg); 
    }
} 

DispatchMessage будет вызывать любую оконную процедуру, которая ему нужна. Этот процесс окна может начать свой собственный цикл (в том же потоке), и он сам вызовет DispatchMessage, который будет вызывать любые обработчики сообщений.

Если вы хотите его увидеть, запустите приложение в отладчике, откройте окно сообщения и сломать. Вы попадете куда-нибудь в его петлю. Посмотрите на стек вызовов и посмотрите, сможете ли вы найти родительский цикл.

2
ответ дан 2 December 2019 в 21:44
поделиться
Другие вопросы по тегам:

Похожие вопросы: