Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Обработка сообщений в невизуалных класах.


BattleCruser ©   (2007-11-27 13:01:00) 

Есть консольное приложение,  и в консоле работает поток ему посылается собщение PostThreadMessage() из другого приожения;
Как обработать (принять) его в потоке консольного приложения?


palva   (2007-11-27 17:36:00) [1]

Вот примерчик. Может, что-нибудь некорректно написал.
Здесь существенно, что первый вызов PostThreadMessage происходит после того, как произошел первый вызов GetMessage, и в созданном потоке создалась очередь сообщений. Если очереди сообщений в потоке не оказалось, то функция PostThreadMessage завершается неудачей.
{$APPTYPE CONSOLE}
uses Windows, Dialogs;
var
 id1 : LongWord;
 thread1 : THandle;
 code: DWord;
 msg: TMsg;
 i: Integer;

function ThreadFun1(Parameter : Pointer) : Integer;
begin
 repeat
   GetMessage(msg, 0, 0, 0);
   WriteLn(msg.message);
 until msg.message = 8;
 ShowMessage('Click to end');
 Result := 0;
end;

begin
 thread1 := CreateThread(nil, 0, @ThreadFun1, Nil, 0, id1);
 for i:= 5 to 8 do begin
   Sleep(100);
   PostThreadMessage(id1, i, 0, 0);
 end;
 repeat
   Sleep(1000);
   PostThreadMessage(id1, 5, 0, 0);
   GetExitCodeThread(thread1, code);
 until Not (code = STILL_ACTIVE);
 WriteLn('OK');
 CloseHandle(thread1);
end.


palva   (2007-11-27 15:53:00) [2]

Чтобы получить сообщение адресованное потоку, нужно вызвать функцию GetMessage или PeekMessage. Поскольку у вас нет Application и нет окон, то цикл получения сообщений и обработку сообщений в консольном приложении организуйте на ваше усмотрение.


Сергей М.   (2007-11-27 14:07:00) [3]


> Ни где толком прочитать не могу как делатьнадо


в теле Execute следует организовать цикл

while not Terminated and GetMessage(Msg, 0, 0, 0) do Dispatch(Msg.Message)


BattleCruser   (2007-11-27 14:02:00) [4]


> Джо ©   (27.11.07 13:55) [5]



> С чего вы взяли, что сообщения будут направляться вашему
> ThreadeMessage?


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


BattleCruser   (2007-11-27 13:59:00) [5]

A если объявить так:

как для оконного пиложения
Procedure ThreadeMessage(var Msg:TMessage); message; WM_USER + 1
В сообщении PostThreadMessage() указать хендл потока, будет работать?


Джо   (2007-11-27 13:55:00) [6]

> [4] BattleCruser   (27.11.07 13:51)
> имелось ввиду приблизительно так:

С чего вы взяли, что сообщения будут направляться вашему ThreadeMessage?


BattleCruser   (2007-11-27 13:51:00) [7]

имелось ввиду приблизительно так:

Type NewThread =class(TThread)
 //......
 Procedure ThreadeMessage(var Msg:TMessage); message;
//.......
end;

Const
 TH_FINISHED = 1;
 TH_FOUND:   = 2;

implementation

Procedure ThreadeMessage(var Msg:TMessage);
begin

 case Msg.WParam of
 
   TH_FINISHED: begin
                  //fineshed
                end;
   
   TH_FOUND:    begin
                  // Find
                end;
end;  

end;

end.


Сергей М.   (2007-11-27 13:34:00) [8]

Это всего лишь объявление метода-обработчика, не более того.


BattleCruser   (2007-11-27 13:32:00) [9]

Например, так сойдет?

Type NewThread =class(TThread)
  //......
  Procedure ThreadeMessage(var Msg:TMessage); message;
 //.......
end;


Сергей М.   (2007-11-27 13:07:00) [10]

Точно так же, как и в любом другом потоке любого другого приложения.


Наверх

Титульная страница Поиск, карта сайта Написать письмо