Главная страница
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.038 c
15-1145334803
balepa
2006-04-18 08:33
2006.05.14
Реклама на сайте Visual Studio 2005


15-1145520353
xayam
2006-04-20 12:05
2006.05.14
Предложение, измененить скрипт этого форума


1-1144400913
Kolan
2006-04-07 13:08
2006.05.14
Как передать в функцию массив записей использия Variant?


3-1143011278
kyn66
2006-03-22 10:07
2006.05.14
Переход через поле в DBGrid


15-1145431382
ilya39
2006-04-19 11:23
2006.05.14
ICQ 2003a vs Miranda 0.4.0.3