- если пофигу в какой последовательности выполняются потоки, то
одним событием можно обойтись
HANDLE Event=CreateEvent(.....);
func1() // - first thread
{WaitForSingleObject(Event,);
...
SetEvent(Event);}
func2() //second thread - тоже самое
{WaitForSingleObject(Event,);
...
SetEvent(Event);}
---------------------------------------------------------
-если стого поочереди выполняются потоки, то одним событием не обойдешься (ИМХО)
2 события - одного ждем, другое ставим:
Да, спасибо, до второго варианта я уже сам доехал, вроде работает :)
Ситуация 2йцукенг : Один поток в цикле изменяет переменную, несколько потоков копируют эту переменную (внутри wait - set) и затем обрабатывают. Каждый поток должен получить свое уникальное значение переменной и все значения должны быть обработаны.
> Народ, мне надо чтобы один поток ждал событие в занятом > состоянии, а другой - свободном (то же самое событие). Кто > въехал - отвечайте.
если я правильно понял, тебе нужно, чтобы один поток выполнялся после того как event станет сигнальным, а второй - после того как event станет не сигнальным
т.е. один из них обязательно будет выполняться сразу, а второй - ждать
ждать пока event перейдёт из сигнального состояние в несигнальное, кажется невозможно (я таких функций не встречал)
выход такой:
1) в этих потоках
do
{
WaitForSingleObject(event, INFINITE);
}
#ifdef THREAD1
while(flag);
#else
while(!flag);
#endif
2) в управляющей фукнции:
flag = true; // or =false
::PulseEvent(event);
желаю удачи :)
p.s.
не очень красивая ситуация;
два потока, из которых выполняется только один
может быть если чуть изменить логику программы, то от неё можно избавиться
<без заголовка>13.09.01 17:03 Автор: йцукенг <jcukeng> Статус: Member
2 ggg:
> не очень красивая ситуация; > два потока, из которых выполняется только один вопрос был поставлен вовсе не так.
речь шла не о поочередной работе 2-х потоков, а о поочередной работе некоторых частей этих потоков.