Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: WinAPI и системное программирование > Приём сообщений


Автор: Zmiy 3.3.2007, 17:49
Объясните, пожалуйста, чем отличается

Код

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;

.

Автор: MetalFan 3.3.2007, 18:23
на мой взгляд разницы особой нет. разве что принято все-таки использовать GetMessage в цикле выборки сообщений...
ну и оба примера содержат по крайней мере одну ошибку.

разницу между Peek и Get Message знаешь?
на всякий случай:
You can use the PeekMessage function to examine a message queue during a lengthy operation. PeekMessage is similar to the GetMessage function; both check a message queue for a message that matches the filter criteria and then copy the message to an MSG structure. The main difference between the two functions is that GetMessage does not return until a message matching the filter criteria is placed in the queue, whereas PeekMessage returns immediately regardless of whether a message is in the queue. 

по поводу ошибки - никак не анализируется ложный вариант(0) значения функции GetMessage... который означает, что в из очереди извлечено сообщение WM_QUIT... и надо бы заверщить приложение(цикл выборки).
ну и замчание - 
...if GetMessage() = True... зачем сравнение с True?

Автор: Zmiy 3.3.2007, 20:49
Цитата(MetalFan @  3.3.2007,  18:23 Найти цитируемый пост)
никак не анализируется ложный вариант(0) значения функции GetMessage

Но у меня в оконной функции при получении сообщения WM_DESTROY устанавливается положительное значение переменной Exit_prog.

Цитата(MetalFan @  3.3.2007,  18:23 Найти цитируемый пост)
зачем сравнение с True? 

Ну да, в принципе незачем. smile

Цитата(MetalFan @  3.3.2007,  18:23 Найти цитируемый пост)
на мой взгляд разницы особой нет.

А нет такого, что getMessage читает сообщения, которые не читает peekMessage? Возможно это глупость, но я просто слышал такую вещь, хотя на практике не замечал.

Автор: Zmiy 4.3.2007, 17:04
В общем, спасибо, вопрос снят, похоже, что первый код использовать просто бессмысленно.

Автор: Elfix 5.3.2007, 05:30
А у меня возникла такая проблема.
Обработка сообщений идет в цикле GetMessage. Но перед запуском цикла у меня создается компонент IdIRC. Компоненту я задаю событие OnMessage. Но при запуске программы код внутри процедуры обработки события OnMessage не возникало. Кто то подсказал мне, что это гдюк Delphi и чтобы все работало нужно программу запускать непосредственно из проводника, а не по нажатию на F9 в Delphi. Но даже такой способ запуска не решил проблему. Мой код:

Код

program Project1;

uses

Windows, IdIRC;

type
TIRCBot = class
constructor Initialize;
destructor ExitProgram;
 procedure IRCMessage(Sender: TObject; AUser: TIdIRCUser; AChannel: TIdIRCChannel; Content: String);
 procedure ExecuteProc;
  private
  Msg: TMsg;
   IRC: TIdIRC;
 end;

procedure TIRCBot.IRCMessage(Sender: TObject; AUser: TIdIRCUser; AChannel: TIdIRCChannel; Content: String);
 begin
 if Content = '!exit' then          // Участок кода в этой процедуре не выполняется вообще
 ExitProgram()                     // Повидимому это связано с зацикливанием программы
 else
 IRC.Say('#services', Content);
end;

function WindowProc(Hwn, Msg, wParam, lParam: Longint): Longint; stdcall;
begin
  Result:=DefWindowProc(Hwn, Msg, wParam, lParam);
 // Не знаю нужна ли эта функция или нет
 // В исходнике вызовов на нее нигде нет
 // Возможно этот код и не выполняется вовсе
end;

procedure TIRCBot.ExecuteProc;
 begin
  Create;
  IRC.Connect();
  IRC.Join('#services');
  while GetMessage(Msg, 0, 0, 0) do // Почему то именно на этой строке возникает бесконечное ожидание, код ниже уже не вополняется
   begin
  TranslateMessage(Msg); // Под отладчиком это место вообще никогда не выполняется
   DispatchMessage(Msg);  // Здесь и происходит зависание программы
  end;
end;

constructor TIRCBot.Initialize;
 begin
 IRC:=TIdIRC.Create(nil);
  IRC.Host:='irc.cyber-net.ru';
 IRC.Port:=6669;
  IRC.Nick:='Nick';
  IRC.AltNick:='Bot';
  IRC.RealName:='Peter';
  IRC.Username:='Bot';
 IRC.OnMessage:=IRCMessage;
end;

destructor TIRCBot.ExitProgram;
begin
IRC.Free;
 Free;
 end;

var
 IRCBot: TIRCBot;

begin
IRCBot:=TIRCBot.Initialize;
 IRCBot.ExecuteProc;
end.

Автор: MetalFan 5.3.2007, 08:35
Цитата(Elfix @  5.3.2007,  05:30 Найти цитируемый пост)
procedure TIRCBot.ExecuteProc;
 begin
  Create; <---- ЭТО ЗДЕСЬ ЗАЧЕМ?
  IRC.Connect();

и вообще отдельную тему заведи

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)