Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.12.23;
Скачать: CL | DM;

Вниз

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

 
BattleCruser   (2007-11-27 13:01) [0]

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


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

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


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

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

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


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

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


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

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

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:55) [5]

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

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


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

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

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


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


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



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


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


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


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


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

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


 
palva ©   (2007-11-27 15:53) [9]

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


 
palva ©   (2007-11-27 17:36) [10]

Вот примерчик. Может, что-нибудь некорректно написал.
Здесь существенно, что первый вызов 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.



Страницы: 1 вся ветка

Текущий архив: 2007.12.23;
Скачать: CL | DM;

Наверх




Память: 0.49 MB
Время: 0.012 c
15-1195595470
Германн
2007-11-21 00:51
2007.12.23
Ещё один вопрос о обновлении Windows


2-1196273237
Kaliostro
2007-11-28 21:07
2007.12.23
Работа с DBase IV через ADO


2-1196509892
WFS
2007-12-01 14:51
2007.12.23
Как сделать из цветного черно белое изображение


15-1196023567
grisme
2007-11-25 23:46
2007.12.23
Понедельная задачка


15-1195814417
Cyrax
2007-11-23 13:40
2007.12.23
Оптимальный способ задания ширины столбцов таблицы.