![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Обработка сообщений в невизуалных класах.
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]Точно так же, как и в любом другом потоке любого другого приложения.