Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Основная";
Текущий архив: 2004.09.12;
Скачать: [xml.tar.bz2];

Вниз

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

 
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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.47 MB
Время: 0.031 c
1-1093360476
appendix
2004-08-24 19:14
2004.09.12
синхронизация stringgrid


1-1093515851
slart
2004-08-26 14:24
2004.09.12
Длительность видео-роликов


9-1084898425
kas-t
2004-05-18 20:40
2004.09.12
Бесплатный движок...


4-1090747632
race1
2004-07-25 13:27
2004.09.12
keys


4-1091186612
Lukin
2004-07-30 15:23
2004.09.12
Рисование курсора мыши в произвольном месте





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский