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

Вниз

Взаимодействие потоков.   Найти похожие ветки 

 
Gear   (2004-08-24 13:42) [0]

Добрый день! Подскажите пожалуйста (очень хотелось бы пример) под Windows как заставить вторичный поток созданный основным ждать какие-либо события от основного потока и при их возникновении выполнять какие-либо действия?
По конкретней, имею сервер UDP, который в основном потоке принимает пакеты помеченные своим ID. На каждый уникальный ID создаёт вторичный поток со своими параметрами и уникальным ID (сессию). Пока основной поток получает пакеты с этим ID он из передаёт вторичному, а вторичный в свою очередь выполняет какие-либо действия (зависит от того какие в UDP пакете указаны команды на выполнения, например: GET,BYE). После того, как вторичный поток от основного получит пакет с командой BYE он должен завершится (сессия завершается).
Сейчас я остановился на том, что созданный мною вторичный поток при выполнении всех своих функций просто завершается. Как быть? Как заставить его висеть и позволять основному потоку передавать ему команды?


 
inic ©   (2004-08-24 14:15) [1]

Может так ? Хотя написано небрежно

TThread2.Execute();
begin
 while True do begin
   if GetCommand = BYE then Exit;
   // Че то еще
   Suspend;
 end;
end;

TThread1.Smth ();
begin
 if FThread2.Suspended then FThread2.Resume;
end;


 
Gear   (2004-08-24 14:26) [2]

То есть по сути вторичный поток должен бегать постоянно в цикле, выполняя функцию если подходит условия и приостанавливаясь когда это ненужно. Это правильное решение? Может у кого-нибудь ещё возникнут какие решения?


 
Digitman ©   (2004-08-24 14:35) [3]


> Gear   (24.08.04 14:26) [2]


решений - море, и всякое при определенных условиях можно считать "правильным"

но вот использовать Suspend я бы не рекомендовал - выводить его из "состоянии комы" придется индивидуально


 
clickmaker ©   (2004-08-24 14:36) [4]

PostThreadMessage + GetMessage в цикле
Либо с помощью событий: TEvent VCL или CreateEvent API + WaitForSingleObject


 
MBo ©   (2004-08-24 14:39) [5]

В поточной функции вторичного потока использовать одну из Wait-функций, например, WaitForMultipleObjects.


 
inic ©   (2004-08-24 14:42) [6]


> Gear   (24.08.04 14:26) [2]
> То есть по сути вторичный поток должен бегать постоянно
> в цикле, выполняя функцию если подходит условия и приостанавливаясь
> когда это ненужно. Это правильное решение? Может у кого-нибудь
> ещё возникнут какие решения?


Он не будет бегать, он уснет.


> Digitman
> но вот использовать Suspend я бы не рекомендовал - выводить
> его из "состоянии комы" придется индивидуально


Не утверждаю обратное, но почему не рекомендуете ?


 
Digitman ©   (2004-08-24 15:06) [7]


> inic ©   (24.08.04 14:42) [6]


> Не утверждаю обратное, но почему не рекомендуете ?


ну а если, предположим, поток должен реагировать на сообщения и/или более чем одно событие, созданные разными трэдами и взводимими ими же в сигн.состояние ? выполнить Resume способен только тот тред, который "знает" ThreadId приостановленного трэда


 
Суслик ©   (2004-08-24 15:07) [8]


> Не утверждаю обратное, но почему не рекомендуете ?

смею предположить, что потому т.к. сам поток не сможет проснуться - его надо будить. А это противоречит исходному заданию "основным ждать какие-либо события от основного потока и при их возникновении выполнять какие-либо действия"


 
Gear   (2004-08-24 17:36) [9]

>Либо с помощью событий: TEvent VCL или CreateEvent API + WaitForSingleObject

пожалуйста если возможно небольшой пример кода как это сделать? потоков будет много. Будет известен ID каждого потока.


 
Gear   (2004-08-24 17:38) [10]

в дополнение..команды вторичным потокам будет давать только основной поток.


 
Fay ©   (2004-08-24 18:22) [11]

Код (псевдокод 8)) ужасный, но наглядный.

var
 dwAnyEvent : DWORD;

procedure ThreadProc(p : Pointer); stdcall;
begin
 while waitforsingleobject(dwAnyEvent, 1000) = WAIT_OBJECT_0 do
    SHowMessage("!");
end;

procedure button1click(
var
 th, tID : DWORD;  
begin
 th := CreateThread(..., 0, tID);
end;

procedure button2click(
begin
 PulseEvent(dwAnyEvent);
end;

initialization
 dwAnyEvent := CreateEvent(...
finalization
 CloseHandle(dwAnyEvent);

end;



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

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

Наверх




Память: 0.49 MB
Время: 0.043 c
1-1093529823
aliced
2004-08-26 18:17
2004.09.12
опять пропала главная панель Делфи


3-1092735465
REA
2004-08-17 13:37
2004.09.12
Сброс Lookup поля


1-1093707101
Lord de Mon
2004-08-28 19:31
2004.09.12
Как извльчь настройки прокси с IE...


3-1092751996
Вика
2004-08-17 18:13
2004.09.12
Помогите с SQL 2


4-1090486416
parovoZZ
2004-07-22 12:53
2004.09.12
Win98 и Delphi7