0

我有一个应用程序,其中一个线程调用 SetEvent,另一个线程等待该事件。但是,从未调用过 CreateEvent。

SetEven 返回 false (ERROR_INVALID_HANDLE),WaitForSingleObject 返回 WAIT_FAILED

昨天,我们提交了一些显然不相关的内容:.rc 中的两行代码从工具栏中删除了按钮。

突然,在 realease-XP-32 上WaitForSingleObject 返回 WAIT_TIMEOUT

但我想知道:

1-为什么资源中的提交(显然不相关)确实改变了 WaitForSingleObject 的返回?

2- 当我从 Visual Studio 启动应用程序 (XP32) 时,我得到的行为与直接启动应用程序时不同。WaitForSingleObject() 返回 WAIT_FAILED 而不是超时。知道为什么吗?

4

2 回答 2

2

由于您从未调用过CreateEvent,因此您的SetEventandWaitForSingleObject正在使用未初始化的变量。未初始化变量的内容是不确定的,因此您最终将未知值传递给SetEventand WaitForSingleObject。看来,对于旧代码,内存使用模式恰好导致未初始化变量的值不是有效句柄的情况,所以你得到了ERROR_INVALID_HANDLE. 进行更改后,内存使用模式发生了变化,现在未初始化的变量具有一个恰好是有效句柄的值,因此WaitForSingleObject函数尽职尽责地等待它。该句柄恰好引用了未发出信号的对象,因此WaitForSingleObject调用超时并返回WAIT_FAILED

换句话说,看似无关的更改暴露了一个预先存在的错误。使用未初始化的数据可能会导致这样的非局部效应。

于 2012-10-04T15:03:50.447 回答
1

如果您正在执行 WaitForSingleObject(),那么该调用是否真的失败了?也许它也抛出了无效句柄错误,所以它看起来只是“接收事件”。也有可能在更改 RC 文件之前从未实际编译过损坏的 CreateEvent() 代码。无论如何,没有看到代码就无法判断。

于 2012-10-03T23:36:52.810 回答