FindFirstChangeNotification多次触发

时间:2011-10-15 00:38:29

标签: c multithreading winapi events wait

我有一个简单的应用程序,它生成两个线程并为其分配一个处理某个文件并将结果保存到另一个文件的任务,而另一个线程则检索有关它的父进程的信息。 我正在使用一些手动重置事件和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 个答案:

答案 0 :(得分:3)

FindFirstChangeNotification返回的句柄无法传递给ResetEvent。如果您想等待其他活动,请使用FindNextChangeNotification。如果您已完成,请使用FindCloseChangeNotification

这由the documentation暗示:“如果函数成功,则返回值是查找更改通知对象的句柄。”它返回查找更改通知对象的句柄,而不是事件。因此,它是ResetEvent的无效参数。