Win32命名事件的间歇性问题

时间:2009-11-23 12:34:45

标签: events winapi synchronization

遇到与进程在不同用户上下文中运行时命名事件相关的间歇性问题:此类事件句柄的WaitForSingleObject(以及WaitForMultipleObjects)也因WAIT_FAILED失败(GetLastError返回6 - 句柄值无效)。

我们有一个应用程序可以在用户帐户下的Windows机器上安排任务,并在完成某些任务后发生问题。

应用程序(JobManager)的服务部分,在用户帐户(CreateProcessAsUser)下启动可执行文件(JobLeader)以运行用户任务,并等待命名事件发出信号。 手动重置命名事件由JobLeader在“Global \”命名空间中创建,并在用户任务完成时发出信号。

JobManager在循环中等待,以10秒的延迟调用WFMO(WaitForMultipleObjects),以查看是否发出了命名事件或JobLeader进程句柄。

由JobManager通过OpenEvent API调用打开的定期命名的事件句柄会导致WFMO(WFSO也会在识别哪个句柄后被调用)返回WAIT_FAILED,错误代码为6 - “无效的句柄值”。 重新打开事件后,此错误可能会消失,或者可能不会 - 由于句柄值无效,WFMO可能会再次返回WAIT_FAILED。

有趣的是,如果没有这个错误,它可能会传递几十个任务,然后 - 按顺序执行几个任务。用于测试的任务是相同的 - 只是一个cmd.exe脚本,转储环境。

有人对此有什么想法吗?

此致   亚历

1 个答案:

答案 0 :(得分:2)

您是否在JobManager中创建了事件,然后在“JobLeader”中打开它?如果没有,您如何在两个进程之间传递事件句柄(和/或名称)?

我的直觉告诉我这是一场竞赛状况......