Справочник функций

Ваш аккаунт

Войти через: 
Забыли пароль?
Регистрация
Информацию о новых материалах можно получать и без регистрации:

Почтовая рассылка

Подписчиков: -1
Последний выпуск: 19.06.2015

peek, get...

20K
01 марта 2007 года
Змiй
12 / / 05.12.2006
Объясните, пожалуйста, чем отличается

Код:
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;


от

 
Код:
while not Close_Program do
begin
 if PeekMessage (Msg, 0, 0, 0, PM_REMOVE) then
 begin
   TranslateMessage (Msg);
   DispatchMessage (Msg)
 end else DoSomething;
end;


.
334
01 марта 2007 года
HexEdit
809 / / 27.07.2006
Насколько я знаю - PeekMessage обрабатывает все виды сообщений (и входящие и исходящие, и те которые впринципе не идут в очередь сообщений), а GetMessage - только вродящие.

Насчет первой записи ничего сказать не могу, ибо не юзал PeekMessage
257
01 марта 2007 года
kosfiz
1.6K / / 18.09.2005
а помоему PeekMessage служит для проверки наличия сообщений в очереди. ей часто пользуются для того, чтобы организовать выполнение какой-либо трудоемкой работы пока есть возможность(так называемый простой). в первом коде проверяется наличие сообщений в очереди и если они есть, то обрабатываются, а если в очереди нет сообщений то выполняется определенная работа. во втором куске также проверяется наличие сообщений в очереди и если они есть то помоему просто удаляются, если сообщений опять же нет, то выполняем работу.

P.S. если ошибся ногами не бить.
20K
02 марта 2007 года
Змiй
12 / / 05.12.2006
Цитата: kosfiz
во втором куске также проверяется наличие сообщений в очереди и если они есть то помоему просто удаляются


Нет, у меня работают оба кода, и на первый взгляд различий не видно.

257
02 марта 2007 года
kosfiz
1.6K / / 18.09.2005
а я и не говорил что что-то не будет работать, перечитай. посмотри в msdn'е http://msdn.microsoft.com/library/default.asp?url=/library/en-us/winui/winui/windowsuserinterface/windowing/messagesandmessagequeues/messagesandmessagequeuesreference/messagesandmessagequeuesfunctions/peekmessage.asp
20K
02 марта 2007 года
Змiй
12 / / 05.12.2006
Если сообщения будут удаляться и не посылаться окну,то как же программа будет работать?? Справку читал, всё равно не понял различия между двумя кусками. Если ты понял, объясни, пожалуйста.
257
02 марта 2007 года
kosfiz
1.6K / / 18.09.2005
[quote=Змiй]Если сообщения будут удаляться и не посылаться окну,то как же программа будет работать?? Справку читал, всё равно не понял различия между двумя кусками. Если ты понял, объясни, пожалуйста.[/quote]
попробую объяснить.
сначала необходимо понять разницу между 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.

посмотрим как работает программа в первом случае. после запуска она работает, но не заходит в цикл(потому что нет MessageBox'а). отсюда можно сделать вывод, что программа находится в ожидании сообщения и до его получения "стоит".
рассмотрим теперь второй вариант. при запуске программа сразу завершается, т.к. нет сообщений в очереди.
из этого примера видно назначение функции PeekMessage - она просто проверяет наличие сообщений в очереди, а функция GetMessage ожидает их(сообщения).
теперь попробую объяснить чем отличается
 
Код:
PeekMessage (Msg, 0, 0, 0, PM_NOREMOVE)

от
 
Код:
PeekMessage (Msg, 0, 0, 0, PM_REMOVE)

итак, в первом случае с помощью PeekMessage мы узнаем только то, что в очереди есть сообщение и все, во втором случае сообщение(я), находящееся в очереди, удаляются(не обрабатываются), т.е. не будет выполняться код соответствующий тому или иному сообщению или всем сразу(зависит от 4 параметра PeekMessage).
используя сочетание функций, как представлено в первом куске твоего кода мы можем следующее: пока юзер не работает с прогой, не жмет кнопки, не перемещает и т.д. мы не обрабатываем сообщения и делаем трудоемкую работу, если же юзер жмет какую-нибудь кнопку и т.п. мы приостанавливаем работу, обрабатываем все сообщения в очереди и если они закончились, опять продожаем работу - не создается впечатления, что прога зависла. во втором куске кода все иначе: сообщения вообще не обрабатываются(не тратим время на их обработку) и может создасться впечатление, что программа зависла. вот вроде все, что можно сказать.

P.S. вообще объясняльщик из меня не очень хороший.
20K
02 марта 2007 года
Змiй
12 / / 05.12.2006
Цитата:
во втором куске кода все иначе: сообщения вообще не обрабатываются(не тратим время на их обработку) и может создасться впечатление, что программа зависла


Хорошо, но моё приложение использует 2й кусок, а именно:

 
Код:
while not Close_Program do
begin
 if PeekMessage (Msg, 0, 0, 0, PM_REMOVE) then
 begin
   TranslateMessage (Msg);
   DispatchMessage (Msg)
 end;
end;

И оно не зависает, при этом совершенно корректно реагирует на перемещение, изменение размеров, ввод с клавиатуры, сообщение таймера...
261
03 марта 2007 года
ahilles
1.5K / / 03.11.2005
короче, второй кусок лучше чем первый!!!!!
20K
03 марта 2007 года
Змiй
12 / / 05.12.2006
Цитата:
короче, второй кусок лучше чем первый


Почему?

257
03 марта 2007 года
kosfiz
1.6K / / 18.09.2005
Змiй
приложи исходник в архивчике, если нетрудно. а там и разберемся что к чему(я могу и ошибаться). у меня, например, все работает как я написал, я поставил фильтр на WM_COMMAND и все нажатия на кнопки не доходят.
334
03 марта 2007 года
HexEdit
809 / / 27.07.2006
Змiй, [COLOR="Red"]Сделай вложением[/COLOR]
257
03 марта 2007 года
kosfiz
1.6K / / 18.09.2005
Змiй
скачал. вообщем, PeekMessage действительно удаляет сообщения из очереди, но удаляет их, обрабатывая, если PM_REMOVE. если PM_NOREMOVE все будет висеть, если не вызывать потом GetMessage(попробуй), т.е. сообщения не обрабатываются самой функцией(с ними вообще ничего не делается, для этого далее вызывается GetMessage): просто узнается есть ли сообщения или нет. предложенные куски кода, на мой взгляд, идентичны.
20K
03 марта 2007 года
Змiй
12 / / 05.12.2006
HexEdit

Ок

kosfiz

PeekMessage с PM_NOREMOVE и без GetMessage я пробовал - понятно, что всё виснет

Цитата:
предложенные куски кода, на мой взгляд, идентичны



А по скорости? :)

257
03 марта 2007 года
kosfiz
1.6K / / 18.09.2005
Змiй
я определял время работы каждого куска несколько раз (для объективности рехзльтатов), но в среднем получилось, что второй код чуток быстрее первого.
20K
03 марта 2007 года
Змiй
12 / / 05.12.2006
kosfiz
Спасибо.
261
04 марта 2007 года
ahilles
1.5K / / 03.11.2005
мне кажется что он быстрее будет работать!!!!
но почему то я (именно я) склоняюсь к использованию второго варианта, хотя бы потому что он меньше места занимает.....
Реклама на сайте | Обмен ссылками | Ссылки | Экспорт (RSS) | Контакты
Добавить статью | Добавить исходник | Добавить хостинг-провайдера | Добавить сайт в каталог