пятница, 19 февраля 2010 г.

Thread pool sample

Приведу пример кода для RegisterWaitForSingleObject. Для начала создаем событие, по которому задача будет выполнятся. В этом примере это будет Event:
HANDLE render_event_ = CreateEvent( NULL, FALSE, FALSE, NULL );
Создается событие с автопереключением (второй аргумент FALSE), чтобы не вызывать вручную ResetEvent.

Далее вызываем RegisterWaitForSingleObject:
RegisterWaitForSingleObject( &render_wait_obj_, render_event_, RenderCallback, SOME_USER_PARAM, 1000, 0 );
Данным вызовом мы говорим вызывать функцию RenderCallback с аргументом SOME_USER_PARAM по событию render_wait_obj_, но не реже одного раза в 1000 миллисекунд. Возвращается render_wait_obj_ типа HANDLE, которое нужно передать в UnregisterWait, когда больше не нужно выполнять задачи зарегестрированного типа (например, при выходе из программы). Функция RenderCallback имеет следующий вид:
VOID CALLBACK RenderCallback( PVOID lpParameter, BOOLEAN TimerOrWaitFired )
{
// Какие-то действия. Параметр TimerOrWaitFired помогает
// узнать причину вызова RenderCallback.
// Ничего связанного с пулом потоков тут делать не требуется.
}
Когда нужно выполнить задачу RenderCallback просто вызываем SetEvent:
SetEvent( render_event_ );

Комментировать в ВКонтакте