FindFirstChangeNotification срабатывает несколько раз - PullRequest
0 голосов
/ 15 октября 2011

У меня есть простое приложение, которое порождает два потока и назначает одному задачу обработки некоторого файла и сохранения результата в другой, в то время как другой поток получает информацию о своем родительском процессе.
Я использую некоторое руководствосброс событий и функция FindFirstChangeNotification.Основной поток входит в бесконечный цикл, вызывая WaitForMultipleObjectsEx.

Вот фрагмент:

while(TRUE){
waitResult = WaitForMultipleObjectsEx(4, eventObjectHandles, FALSE, 5000, FALSE);
    switch(waitResult){
        case WAIT_OBJECT_0 + 0:
            _tprintf(_T("\nThread with ID: %d has finished processing the poem.\n"), threadIds[0]);
            _tprintf(_T("Output file path: %s\n"), thread_xyz_param.outputPath);
            ResetEvent(eventObjectHandles[0])
            break;
        case WAIT_OBJECT_0 + 1:
            ResetEvent(eventObjectHandles[1]);
            break;
        case WAIT_OBJECT_0 + 2:
            _tprintf(_T("Error in thread with ID: %d!\n"), threadIds[0]);
            ResetEvent(eventObjectHandles[2]);
            break;
        case WAIT_OBJECT_0 + 3:
            _tprintf(_T("Error in thread with ID: %d!\n"), threadIds[1]);
            ResetEvent(eventObjectHandles[3]);
            break;
    }

    GetExitCodeThread(threadHandles[0], &firstThreadStatus);
    GetExitCodeThread(threadHandles[1], &secondThreadStatus);

    if((firstThreadStatus != STILL_ACTIVE) && (secondThreadStatus != STILL_ACTIVE)){
        break;
    }
}

Проблема в том, что функция FindFirstChangeNotification сигнализирует несколько раз, хотя язаписать в выходной файл только один раз.
Это хорошая идея, чтобы позвонить FindCloseChangeNotification вместо ResetEvent?

Заранее спасибо!

1 Ответ

3 голосов
/ 15 октября 2011

Дескриптор, возвращенный FindFirstChangeNotification, не может быть передан ResetEvent. Если вы хотите дождаться другого события, используйте FindNextChangeNotification. Если вы закончили с этим, то используйте FindCloseChangeNotification.

Это подразумевается в документации : «Если функция завершается успешно, возвращаемое значение является дескриптором объекта уведомления об изменении поиска». Он возвращает дескриптор объекта уведомления об изменении поиска, а не событие. Поэтому это неверный параметр для ResetEvent.

...