Модераторы: Snowy, bartram, MetalFan, bems, Poseidon, Riply
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Приём сообщений 
V
    Опции темы
Zmiy
  Дата 3.3.2007, 17:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 3.3.2007

Репутация: нет
Всего: 2



Объясните, пожалуйста, чем отличается

Код

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;

.
PM MAIL   Вверх
MetalFan
Дата 3.3.2007, 18:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



на мой взгляд разницы особой нет. разве что принято все-таки использовать 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?


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
Zmiy
Дата 3.3.2007, 20:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 3.3.2007

Репутация: нет
Всего: 2



Цитата(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? Возможно это глупость, но я просто слышал такую вещь, хотя на практике не замечал.
PM MAIL   Вверх
Zmiy
Дата 4.3.2007, 17:04 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 39
Регистрация: 3.3.2007

Репутация: нет
Всего: 2



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

PM MAIL   Вверх
Elfix
Дата 5.3.2007, 05:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 167
Регистрация: 13.7.2005

Репутация: нет
Всего: нет



А у меня возникла такая проблема.
Обработка сообщений идет в цикле 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.

PM MAIL   Вверх
MetalFan
Дата 5.3.2007, 08:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 16
Всего: 128



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

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

Это сообщение отредактировал(а) MetalFan - 5.3.2007, 08:36


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: WinAPI и системное программирование"
Snowybartram
MetalFanbems
PoseidonRrader
Riply

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Delphi обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • 99% ответов по WinAPI можно найти в MSDN Library, оставшиеся 1% здесь

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, bartram, MetalFan, bems, Poseidon, Rrader, Riply.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: WinAPI и системное программирование | Следующая тема »


 




[ Время генерации скрипта: 0.0463 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.