Форум: "Начинающим";
Текущий архив: 2006.05.14;
Скачать: [xml.tar.bz2];
ВнизНесколько вопросов про потоки и сообщения Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.01 c