Главная страница
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.029 c
3-1092750216
Jey
2004-08-17 17:43
2004.09.12
Резервное копирование баз данных


14-1092761103
KaLLeKa
2004-08-17 20:45
2004.09.12
Подскажите плийз, я в железе ничего не понимаю...


4-1087747824
parovoZZ
2004-06-20 20:10
2004.09.12
Перетащитиь форму не за заголовок


4-1090960058
юзверь
2004-07-28 00:27
2004.09.12
как програмно перемещать TOOLBAR?


14-1093088582
YurikGL
2004-08-21 15:43
2004.09.12
16 цветов