Главная страница
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.02 c
7-63413
Tik
2003-10-31 11:52
2004.01.20
получить иконку


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


1-63149
Tahion2
2004-01-01 17:18
2004.01.20
Как задать путь по умолчанию для диалога выбора папки?


8-63256
Sliski Slimak
2003-09-19 12:02
2004.01.20
Как сохранить bmp в файл на WinAPI?


7-63411
dream
2003-11-06 11:26
2004.01.20
Как узнать запушена ли программа написанная на winapi