Форум: "Основная";
Текущий архив: 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