WaitForSingleObject - 每个线程一次

时间:2016-02-18 21:08:14

标签: c++ multithreading

我有一个使用此代码发送信号的程序:

ISO-8859-15

我有4个程序等待这个信号并调用一个函数:

hEvent = CreateEvent(NULL, FALSE, FALSE, szEventName);
...
SetEvent(hEvent);

问题是当其中一个程序使用WaitForSingleObject捕获信号时,其他客户端无法获取它! (只有一个程序,随机,获取信号)

有没有办法确保我的所有4个程序都收到信号?

1 个答案:

答案 0 :(得分:5)

第二个参数" FALSE"生成自动重置事件。通过在参数2中指定TRUE,您需要手动重置事件:

hEvent = CreateEvent(NULL, TRUE, FALSE, szEventName);

注意CreateEvent的第二个参数:

HANDLE WINAPI CreateEvent(
  _In_opt_ LPSECURITY_ATTRIBUTES lpEventAttributes,
  _In_     BOOL                  bManualReset,
  _In_     BOOL                  bInitialState,
  _In_opt_ LPCTSTR               lpName
);

如果您只需要触发一次就很容易,但是如果您需要多次触发它,您需要通过让依赖的应用程序向源发送通知来确定如何重置它,以便知道所有4个已收到它

API文档中的更多信息:

"当手动重置事件对象的状态发出信号时,它将保持信号状态,直到它被ResetEvent函数显式重置为无信号。当对象的状态发出信号时,可以释放任意数量的等待线程或随后开始指定事件对象的等待操作的线程。

当发出自动重置事件对象的状态信号时,它会一直发出信号,直到释放一个等待的线程为止;然后系统自动将状态重置为无信号。如果没有线程在等待,则事件对象的状态仍然发出信号。"