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


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

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

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


То есть код
if @IdleProc <> nil then IdleProc
может обратиться к нулевому адресу, если между проверкой на ноль и вызовом произошла обработка сообщения, которые выставило IdleProc в nil?
PeekMessage мне сам нужен не для обработчки сообщения, а просто чтобы узнать, если ли что обрабатывать.
По идее, мне нужен универсальный главцикл, который для @IdleProc=nil просто ждёт сообщение, не гоняя проц по циклу, а для <>nil выполняет этот IdleProc, елси никаких сообщений в очереди нет.
Пока что он у меня такой:

procedure GetMessages;
var
Message: TMsg;
begin
repeat
try
if not PeekMessage(Message, 0, 0, 0, 0) and (@IdleProc <> nil) then IdleProc
else begin
if not GetMessage(Message, 0, 0, 0) then Break;
if TranslateAccelerator(FormStack.Handle, FormStack.Accels, Message) = 0 then begin
TranslateMessage(Message);
DispatchMessage(Message);
end;
end;
except
MessageBox(MainForm, PChar('Runtime error ' + IntToHex(ExceptionCode)), 'ERROR', mb_OK or mb_IconError);
end;
until False;
end;



--------------------
 Оффлайн  Профиль  PM 
 К началу страницы 
+ Ответить 

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


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

 





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