IPB
ЛогинПароль:

> ВНИМАНИЕ!

Прежде чем задать вопрос, смотрите FAQ.
Рекомендуем загрузить DRKB.

Наладить общение поможет, если вы подпишитесь по почте на новые темы в этом форуме.

> Что делает PeekMessage
сообщение
Сообщение #1


Злостный любитель
*****

Группа: Пользователи
Сообщений: 1 755
Пол: Мужской

Репутация: -  62  +


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

if (@IdleProc <> nil) and not PeekMessage(Message, 0, 0, 0, pm_NoRemove) then IdleProc

По моему замыслу, она должна работать так: если процедура ожидания есть и нету сообщений в очереди, то выполнить процедуру ожидания. Однако после долгой отладки выяснилось, что PeekMessage зачем-то ещё и пытается обработать сообщение! Ну и внутри обработчика деактивации IdleProc ставился на nil, чтобы свёрнутая программа проц не ела, а потом этот IdleProc пытался вызваться.
Так вот, что делать, чтобы просто проверить наличие сообщений? Я не хочу, чтобы она их ещё и обрабатывала.
Я САМ РЕШУ, когда мне надо обработать сообщение, а когда нет!


--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 
 
 Ответить  Открыть новую тему 
Ответов
сообщение
Сообщение #2


Гость






Цитата
Типы сообщений
синхронные сообщения (queued) - сообщения, которые Windows помещает в очередь сообщений программы, и которые извлекаются и диспетчеризуются в цикле обработки сообщений.
Отправление: с помощью функции PostMessage – ставится в очередь и немедленно возвращает управление.
Получение: результат пользовательского ввода путем нажатия клавиш (например, WM_KEYDOWN и WM_KEYUP), это символы, введенные с клавиатуры (WM_CHAR), результат движения мыши (WM_MOUSEMOVE) и щелчков кнопки мыши (WM_LBOTTONDOWN). Кроме этого синхронные сообщения включают в себя сообщение от таймера (WM_TIMER), сообщение о необходимости плановой перерисовки (WM_PAINT) и сообщение о выходе из программы (WM_QUIT)

асинхронные сообщения (nonqueued) – сообщения, передающиеся непосредственно окну, когда Windows вызывает оконную процедуру.
Отправление: с помощью функции SendMessage – не ставится в очередь, оконная процедура вызывается непосредственно, а возврат управления только после обработки сообщения оконной процедурой.
Получение: во всех остальных случаях, не указанных в получении синхронных сообщений, часто являются результатом синхронных сообщений.
Ну, или здесь: MSDN -> Message Routing (англ.)

Понимаешь разницу, да? PeekMessage что делает?
Цитата
PeekMessage Function
Dispatches incoming sent messages, checks the thread message queue for a posted message, and retrieves the message (if any exist).
А WM_ACTIVATE в очередь не поступает, а обрабатывается сразу после получения в WndProc (в функции окна). А потом твоя программа опять ждет появления событий (синхронных!!!) в очереди.
 К началу страницы 
+ Ответить 

Сообщений в этой теме


 Ответить  Открыть новую тему 
1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0

 





- Текстовая версия 10.05.2024 12:28
500Gb HDD, 6Gb RAM, 2 Cores, 7 EUR в месяц — такие хостинги правда бывают
Связь с администрацией: bu_gen в домене octagram.name