我有一个简单的应用程序,它生成两个线程,并分配一个线程处理某个文件并将结果保存到另一个线程,而另一个线程检索有关其父进程的信息。
我正在使用一些手动重置事件和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
是个好主意吗?提前谢谢!
最佳答案
FindFirstChangeNotification
返回的句柄不能传递给ResetEvent
。如果要等待另一个事件,请使用FindNextChangeNotification
。如果已经完成,则使用FindCloseChangeNotification
。
这由the documentation:“如果函数成功,返回值是查找更改通知对象的句柄。”它返回查找更改通知对象的句柄,而不是事件。因此,它是一个无效的参数ResetEvent
。