Форум: "Начинающим";
Текущий архив: 2007.12.23;
Скачать: [xml.tar.bz2];
ВнизОбработка сообщений в невизуалных класах. Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.47 MB
Время: 0.045 c