我有一个应用程序,其中一个线程调用SetEvent,另一个线程等待该事件。但是,从未调用过CreateEvent。
SetEven返回false(ERROR_INVALID_HANDLE),WaitForSingleObject返回WAIT_FAILED
昨天,我们提交了一些显然不相关的内容:工具栏中.rc删除按钮中的两行代码。
突然,在realease-XP-32上, WaitForSingleObject返回WAIT_TIMEOUT 。
但我想知道:
1-为什么ressources中的提交(显然不相关)确实改变了WaitForSingleObject的返回值?
2-当我从Visual Studio启动应用程序(XP32)时,我得到的行为与直接启动应用程序时的行为不同。 WaitForSingleObject()返回WAIT_FAILED而不是超时。知道为什么吗?
答案 0 :(得分:2)
由于您从未致电CreateEvent
,因此您的SetEvent
和WaitForSingleObject
使用的是未初始化的变量。未初始化变量的内容是不确定的,因此您最终会将未知值传递给SetEvent
和WaitForSingleObject
。看来,对于旧代码,内存使用模式恰好导致未初始化变量的值不是有效句柄的情况,因此您得到ERROR_INVALID_HANDLE
。进行更改后,内存使用模式发生了变化,现在未初始化的变量的值恰好是一个有效的句柄,因此WaitForSingleObject
函数会尽职尽责地等待它。该句柄恰好引用未发信号的对象,因此WaitForSingleObject
调用超时并返回WAIT_FAILED
。
换句话说,看似无关的变化暴露了预先存在的错误。使用未初始化的数据可能会导致像这样的非局部效应。
答案 1 :(得分:1)
如果您正在执行WaitForSingleObject(),那该调用实际上是否失败?也许它也抛出了无效的句柄错误所以它看起来只是“接收事件”。也可能在RC文件发生更改之前,实际上从未实际编译过的CreateEvent()代码。无论如何,如果没有看到代码,就没有办法告诉你。