Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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.

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


Наверх

Титульная страница Поиск, карта сайта Написать письмо