Форум: "WinAPI";
Текущий архив: 2004.01.20;
Скачать: [xml.tar.bz2];
Вниз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 вся ветка
Форум: "WinAPI";
Текущий архив: 2004.01.20;
Скачать: [xml.tar.bz2];
Память: 0.46 MB
Время: 0.011 c