Главная страница
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.028 c
15-1144404805
MBo
2006-04-07 14:13
2006.05.14
Пятничные задачки


2-1145567005
jenya_rus
2006-04-21 01:03
2006.05.14
Компонент подобный Memo...со свойством LoadFromFile...


2-1146133015
gav
2006-04-27 14:16
2006.05.14
установка компонентов


2-1146025378
Юрик
2006-04-26 08:22
2006.05.14
Как сделать бегущую строку???


2-1145914797
Slinne
2006-04-25 01:39
2006.05.14
Помогите написать простенькую процедуру (Delphi).