![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
PostMessage в TThread [D7, WinXP]
konstantinov © (2003-11-13 23:51:00)
Есть бесконечный цикл в 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;
konstantinov (2003-11-14 18:10:00) [1]
Большое спасибо!
Еще не пробовал Ваши советы, но надеюсь получится! :)
Digitman (2003-11-14 08:11:00) [2]
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;
Suntechnic (2003-11-14 02:12:00) [3]
И в-третьих, а где собственно говоря сам второй поток? Что то не видно чтобы его кто-то создавал, кто то запускал.
Сорри, не досмотрел. Создание и запуск потока есть, только вот терзают меня сомнения, что надо создавать новый поток на каждый проход цикла while. Логики конечно не видно, но обычно так потоки не плодят. Создают один и пресыпляют его на время ожидания сообщений, как описано у меня в предпоследнем пункте.
Suntechnic (2003-11-14 02:05:00) [4]
Во-первых
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.
Ну и кончено не забываем про синхронизацию данных.