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

Вниз

PostMessage в TThread   Найти похожие ветки 

 
konstantinov ©   (2003-11-13 23:51) [0]

Есть бесконечный цикл в TThread. Время от времени возникает необходимость вызвать из этого потока процедуру и не дожидаясь ее обработки продолжить выполнение потока. Как это сделать?
вот примерно как я себе это представляю, но увы, не работает :(

//первый поток
const
WM_MYMESSAGE = WM_USER + 8;

implementation

procedure TMyThread.Execute;
var MX : TMyThread2;
begin
while условие do
begin
MX := TMyThread2.Create(false);
PostMessage ( MX.Handle, WM_MYMESSAGE, 0, 0);

end;
end;

//Модуль второго потока

type
TmyThread2 = class(TThread)
private
procedure WMMYMESSAGE ( var message: TMessage); message WM_MYMESSAGE;
end;

implementation

procedure TMyThread2.WMMYMESSAGE(var message: TMessage);
begin

end;


 
Suntechnic ©   (2003-11-14 02:05) [1]

Во-первых PostMessage используется для посылки сообщений окнам, а не потокам. Для потоков следует использовать PostThreadMessage.

Во-вторых
Message handlers are methods that implement responses to dynamically dispatched messages. Delphi’s VCL uses message handlers to respond to Windows messages.
Это по поводу того, что ты пытаешься поймать с помощью директивы message.

И в-третьих, а где собственно говоря сам второй поток? Что то не видно чтобы его кто-то создавал, кто то запускал.

Теперь как надо делать:
-Меняешь PostMessage на PostThreadMessage. Только учти, что параметром там уже не handle потока, а ID потока.
- Запускаешь второй поток и присыпляешь его на время ожидания сообщения с помощью GetMessage (это конечно только в том случае, если второй поток ничего не должен делать кроме как ждать сообщения от первого потока. Если ситуация несколько иная надо смотреть логику.)
- Если эта процедура должна повторится, то GetMessage помещаешь в цикл while организуя таким образом цикл обработки сообщений потока.
- Завершаешь поток, если имеет место быть предыдущий сценарий, путём посылки WM_QUIT.

Ну и кончено не забываем про синхронизацию данных.


 
Suntechnic ©   (2003-11-14 02:12) [2]

И в-третьих, а где собственно говоря сам второй поток? Что то не видно чтобы его кто-то создавал, кто то запускал.

Сорри, не досмотрел. Создание и запуск потока есть, только вот терзают меня сомнения, что надо создавать новый поток на каждый проход цикла while. Логики конечно не видно, но обычно так потоки не плодят. Создают один и пресыпляют его на время ожидания сообщений, как описано у меня в предпоследнем пункте.


 
Digitman ©   (2003-11-14 08:11) [3]

procedure TMyThread.Execute;
var
Msg: TMsg;
begin
...
while GetMessage(Msg, 0, 0, 0) do
Dispatch(Msg.Message);
...
end;

...
MX := TMyThread.Create(false);
while not PostThreadMessage (MX.ThreadId, WM_MYMESSAGE, 0, 0) do;


 
konstantinov ©   (2003-11-14 18:10) [4]

Большое спасибо!
Еще не пробовал Ваши советы, но надеюсь получится! :)



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

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

Наверх




Память: 0.47 MB
Время: 0.025 c
1-63196
Can_kill
2004-01-10 03:11
2004.01.20
Прерывание


4-63447
Rul
2003-11-13 12:29
2004.01.20
ICQ


1-63242
WondeRu
2004-01-09 10:30
2004.01.20
Unload Driver


1-63246
Вованчик
2004-01-09 09:38
2004.01.20
Hint


1-63085
MikeZ
2004-01-06 17:34
2004.01.20
Дерево компонентов