Здравствуйте, Alexmoon, Вы писали:
A>9. В методе добавления элемента в список, в самом конце выставление события в сигнальное состояние.
A>10.В методе извлечения в конце с проверкой очереди на пустоту сбрасывание, если элементов нет.
Предположим, что кол-во элементов нам известно(для упрощения схемы). Пусть их будет, например, 5. =>
.........
HANDLE hEvent; // глобальная переменная, так же как и thread;
.........
i = 0;
while (i < 5) {
hEvent = CreateEvent(NULL, false, false, "asda");
thread = AfxBeginThread((AFX_THREADPROC) Our_Func,
element[i],
THREAD_PRIORITY_NORMAL,
0,
0,
NULL);
SetEvent(hEvent); // выставляем событие в сигнальное состояние, чтобы Our_Func запустилась
ResetEvent(hEvent); // сбрасываем событие
i++;
}
.............
...Our_func..()
{
WaitForSingleObject(hEvent,INFINITE); // ожидаем сигнала
................
................
SetEvent(hEvent);
return true;
}
Так вот, если у нас всего 2 элемента, то все хорошо, однако при большем количестве накапливается куча ожидающих своего часа событий, и как только 1-й завершившийся трэд делает SetEvent(hEvent), они все дружно просыпаются...., можно конечно в цикл запихать WaitForSingleObject(hEvent,INFINITE), но тогда смысл трэдов теряется.
Да и с SetEvent(hEvent) внутри цикла нужно что-то делать, т.к. это неправильно, да и по логике работать не должно