while not Close_Program do
begin
if PeekMessage (Msg, 0, 0, 0, PM_NOREMOVE) then
begin
if GetMessage (Msg, 0, 0, 0) = True then
begin
TranslateMessage (Msg);
DispatchMessage (Msg)
end
end else DoSomething;
end;
peek, get...
Код:
от
Код:
while not Close_Program do
begin
if PeekMessage (Msg, 0, 0, 0, PM_REMOVE) then
begin
TranslateMessage (Msg);
DispatchMessage (Msg)
end else DoSomething;
end;
begin
if PeekMessage (Msg, 0, 0, 0, PM_REMOVE) then
begin
TranslateMessage (Msg);
DispatchMessage (Msg)
end else DoSomething;
end;
.
Насчет первой записи ничего сказать не могу, ибо не юзал PeekMessage
P.S. если ошибся ногами не бить.
Цитата: kosfiz
во втором куске также проверяется наличие сообщений в очереди и если они есть то помоему просто удаляются
Нет, у меня работают оба кода, и на первый взгляд различий не видно.
а я и не говорил что что-то не будет работать, перечитай. посмотри в msdn'е
Если сообщения будут удаляться и не посылаться окну,то как же программа будет работать?? Справку читал, всё равно не понял различия между двумя кусками. Если ты понял, объясни, пожалуйста.
попробую объяснить.
сначала необходимо понять разницу между PeekMessage и GetMessage, чтобы было проще набросай маленькую прожку такого вида:
Код:
program test;
uses
windows;
var msg:TMsg;
begin
while GetMessage(msg,0,0,0) do //вариант 1
begin
MessageBox(0,'','',0);
TranslateMessage(msg);
DispatchMessage(msg);
end;
{while PeekMessage(msg,0,0,0,PM_NOREMOVE) do //вариант 2
begin
MessageBox(0,'','',0);
TranslateMessage(msg);
DispatchMessage(msg);
end;}
end.
uses
windows;
var msg:TMsg;
begin
while GetMessage(msg,0,0,0) do //вариант 1
begin
MessageBox(0,'','',0);
TranslateMessage(msg);
DispatchMessage(msg);
end;
{while PeekMessage(msg,0,0,0,PM_NOREMOVE) do //вариант 2
begin
MessageBox(0,'','',0);
TranslateMessage(msg);
DispatchMessage(msg);
end;}
end.
посмотрим как работает программа в первом случае. после запуска она работает, но не заходит в цикл(потому что нет MessageBox'а). отсюда можно сделать вывод, что программа находится в ожидании сообщения и до его получения "стоит".
рассмотрим теперь второй вариант. при запуске программа сразу завершается, т.к. нет сообщений в очереди.
из этого примера видно назначение функции PeekMessage - она просто проверяет наличие сообщений в очереди, а функция GetMessage ожидает их(сообщения).
теперь попробую объяснить чем отличается
Код:
PeekMessage (Msg, 0, 0, 0, PM_NOREMOVE)
от
Код:
PeekMessage (Msg, 0, 0, 0, PM_REMOVE)
итак, в первом случае с помощью PeekMessage мы узнаем только то, что в очереди есть сообщение и все, во втором случае сообщение(я), находящееся в очереди, удаляются(не обрабатываются), т.е. не будет выполняться код соответствующий тому или иному сообщению или всем сразу(зависит от 4 параметра PeekMessage).
используя сочетание функций, как представлено в первом куске твоего кода мы можем следующее: пока юзер не работает с прогой, не жмет кнопки, не перемещает и т.д. мы не обрабатываем сообщения и делаем трудоемкую работу, если же юзер жмет какую-нибудь кнопку и т.п. мы приостанавливаем работу, обрабатываем все сообщения в очереди и если они закончились, опять продожаем работу - не создается впечатления, что прога зависла. во втором куске кода все иначе: сообщения вообще не обрабатываются(не тратим время на их обработку) и может создасться впечатление, что программа зависла. вот вроде все, что можно сказать.
P.S. вообще объясняльщик из меня не очень хороший.
Цитата:
во втором куске кода все иначе: сообщения вообще не обрабатываются(не тратим время на их обработку) и может создасться впечатление, что программа зависла
Хорошо, но моё приложение использует 2й кусок, а именно:
Код:
while not Close_Program do
begin
if PeekMessage (Msg, 0, 0, 0, PM_REMOVE) then
begin
TranslateMessage (Msg);
DispatchMessage (Msg)
end;
end;
begin
if PeekMessage (Msg, 0, 0, 0, PM_REMOVE) then
begin
TranslateMessage (Msg);
DispatchMessage (Msg)
end;
end;
И оно не зависает, при этом совершенно корректно реагирует на перемещение, изменение размеров, ввод с клавиатуры, сообщение таймера...
короче, второй кусок лучше чем первый!!!!!
Цитата:
короче, второй кусок лучше чем первый
Почему?
приложи исходник в архивчике, если нетрудно. а там и разберемся что к чему(я могу и ошибаться). у меня, например, все работает как я написал, я поставил фильтр на WM_COMMAND и все нажатия на кнопки не доходят.
Змiй, [COLOR="Red"]Сделай вложением[/COLOR]
скачал. вообщем, PeekMessage действительно удаляет сообщения из очереди, но удаляет их, обрабатывая, если PM_REMOVE. если PM_NOREMOVE все будет висеть, если не вызывать потом GetMessage(попробуй), т.е. сообщения не обрабатываются самой функцией(с ними вообще ничего не делается, для этого далее вызывается GetMessage): просто узнается есть ли сообщения или нет. предложенные куски кода, на мой взгляд, идентичны.
Ок
kosfiz
PeekMessage с PM_NOREMOVE и без GetMessage я пробовал - понятно, что всё виснет
Цитата:
предложенные куски кода, на мой взгляд, идентичны
А по скорости? :)
я определял время работы каждого куска несколько раз (для объективности рехзльтатов), но в среднем получилось, что второй код чуток быстрее первого.
Спасибо.
но почему то я (именно я) склоняюсь к использованию второго варианта, хотя бы потому что он меньше места занимает.....