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

Вниз

Несколько вопросов про потоки и сообщения   Найти похожие ветки 

 
FunkyByte ©   (2006-04-22 15:26) [0]

Доброго времени суток, уважаемые мастера. При работе с потоками возник ряд вопросов.

1. В приложении создал поток, как объект класса-потомка TThread, единственное назначение которого - обрабатывать сообщение WM_TRANSIT=WM_USER+1. Ниже приведён код метода Execute:

procedure THandlerThread.Execute;
begin
 { Place thread code here }
 if GetMessage(Msg,0,WM_TRANSIT,WM_TRANSIT) then
   begin
     ...
   end;
end;

Проблема заключается в том, что поток завершается после обработки первого сообщения WM_TRANSIT. Попытался сделать так:

procedure THandlerThread.Execute;
begin
 { Place thread code here }
 while not GetMessage(Msg,0,WM_QUIT,WM_QUIT) do
   if Msg.message=WM_TRANSIT then
     begin
       ...
     end;
end;

При этом обработка сообщения WM_TRANSIT вообще не происходила.
Как в потоке организовать непрерывный цикл обработки сообщений, при котором поток не закрывался бы после обработки первого сообщения?

2. Как можно создать аналогичный поток-обработчик сообщений не пользуясь классами-потомками TThread, пользуясь только API? В случае, описанном в п.1 понятно хотя бы где реализовывать цикл обработки сообщений - в методе Execute. При реализации на "чистом" API это не понятно.

3. Как в рамках одного процесса можно через асинхронные сообщения передать строку из одного потока другому? Раньше для этих целей я пользовался WM_COPYDATA, но его можно передавать только синхронно. В моём случае синхронная передача не подходит.

Заранее благодарен.


 
MBo ©   (2006-04-22 15:41) [1]

while (not Terminated) and GetMessage(Msg, 0, 0, 0) do   begin
 //если нужный Msg, обрабатываем
end


 
Leonid Troyanovsky ©   (2006-04-22 16:08) [2]


> MBo ©   (22.04.06 15:41) [1]

> while (not Terminated) and GetMessage(Msg, 0, 0, 0) do  


not Terminated - лишние, бо такой поток естественно
заканчивать путем post WM_QUIT.

--
Regards, LVT.


 
Leonid Troyanovsky ©   (2006-04-22 16:16) [3]


> FunkyByte ©   (22.04.06 15:26)  

> не пользуясь классами-потомками TThread, пользуясь только
> API? В случае, описанном в п.1 понятно хотя бы где реализовывать
> цикл обработки сообщений - в методе Execute. При реализации
> на "чистом" API это не понятно.

В функции потока, вестимо.

> только синхронно. В моём случае синхронная передача не подходит.


А почему, собс-но? Для приема синхронных сообщений потоку
необходимо создать окно.

Для асинхронной обработки в рамках своего процесса достаточно
передавать указатель на блок, распределенный в потоке отправителе,
при условии, что освобождаться он будет в потоке-приемнике
(не забывать про IsMultiThread).

--
Regards, LVT.



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

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

Наверх




Память: 0.48 MB
Время: 0.026 c
2-1145996978
Неважно
2006-04-26 00:29
2006.05.14
преобразования Hex в TDateTime(или String)


15-1144698408
Галинка
2006-04-10 23:46
2006.05.14
Ищу книгу


2-1146131742
eclipse
2006-04-27 13:55
2006.05.14
Передача данных между формами


2-1145530972
Александр Б.
2006-04-20 15:02
2006.05.14
Изменение исходников


15-1143752553
__Иксик__
2006-03-31 01:02
2006.05.14
Любэ