用C ++创建/打开事件并检查它们是否被触发

我有两个线程使用事件进行同步。 在每个线程中,他们使用相同的调用:

::CreateEvent( NULL,TRUE,FALSE,tcEventName )

生产者线程是首先进行调用的线程,而消费者线程使得调用最后一次,所以它在技术上是开放的,而不是创建事件......我假设。

但是,当在生产者线程中调用SetEvent时,相同的事件永远不会在消费者线程中触发(我正在使用WaitForMultipleObjects())

有没有一种工具可以告诉我事件是否真正被正确触发。

另外,当我在每个线程中调用CreateEvent()时,返回的句柄值对于每个线程都是不同的...应该是相同的吗?

有没有更好的方法来做到这一点,以确保它的工作?

这是使用Visual Studio 2005的Windows XP

编辑:我做了一些更多的检查,发现调用生产者线程中的CreateEvent(第二个调用CreateEvent)将LastError设置为183(ERROR_ALREADY_EXISTS),但是CreateEvent仍然返回事件的句柄...什么给了? 它如何错误已存在,但仍然返回句柄? 还是应该这样做?


根据CreateEvent的MSDN文档,

如果函数成功,则返回值是事件对象的句柄。 如果指定的事件对象在函数调用之前存在,则该函数返回现有对象的句柄,并且GetLastError返回ERROR_ALREADY_EXISTS。

根据你的描述,我没有看到你在做什么的问题。 我没有看到任何东西表明你在做错误的事情。 不过,对于我来说,我通常使用CreateEvent()创建事件,然后将句柄传递给我想通过该事件发送信号的线程。 但是你的方法没有任何技术上的错误。

你会意识到WaitForMultipleObjects()返回句柄数组中第一个信号处理的索引,对吗? 例如,如果您的已命名事件是列表中的第二个事件,但绝大多数时间(例如,通过快速行为线程或手动重置事件发出信号,但从未重置),第一个句柄会发出信号,WaitForMultipleObjects ()将始终返回WAIT_OBJECT_0。 换句话说,您的消费者线程将永远不会看到您的已命名事件发出信号,因为第一个句柄“始终”发送信号。 如果是这种情况,请将您的指定事件放在列表中。

您不会碰巧将WaitForMultipleObjects()的bWaitAll参数设置为TRUE,对吗? 如果这样做,那么在函数返回之前,句柄数组中的所有句柄都有信号。

谁为你的命名事件调用了ResetEvent()? 它应该是消费者。 这不是偶然被某个第三方线程调用的,是吗?

这些只是一些需要仔细检查的事情。 如果事件仍然不像您期望的那样运行,请用WaitForSingleObject()替换WaitForMultipleObjects()以查看您的命名事件是否正确地指示消费者线程。

希望这可以帮助。


如果你只在一个进程中使用多个线程,为什么不把事件句柄从一个传递到另一个呢? 据我所知,创建的命名内核对象可在进程之间共享它们。

你也可以尝试使用OpenEvent函数来打开已经创建的事件。 这可能会提供一些想法。


你的代码应该像你描述的那样工作。 如果事件在您尝试创建时已经存在,您将获得现有事件的句柄。

每个线程的句柄是不同的,所以如果它们不同(不用担心),你不必担心。

我建议你简化一下,看看事情是否按照你期望的方式工作。 你使用WaitForMultipleObjects()的事实告诉我你还有其他的东西在继续。 如果你认为它不起作用,请去掉其他东西,看看你是否可以搞清楚。

链接地址: http://www.djcxy.com/p/30795.html

上一篇: Creating/Opening Events in C++ and checking if they are fired

下一篇: Error while decoding camera stream video frame using FFMpeg iOS