【问题标题】:Create and open event in different process在不同的过程中创建和打开事件
【发布时间】:2015-03-28 14:50:52
【问题描述】:

我正在尝试使用事件同步两个进程。

在第一个进程中,我创建一个事件,打开第二个进程,做一些操作,发出事件信号并等待第二个进程。第二个进程尝试打开创建的事件并等待信号,但是在打开的进程中,我收到错误代码 2 = not found。

第一道工序:

hEvent = CreateEvent(NULL, FALSE, FALSE, L"MyEvent");
if (NULL == hEvent)
{
    __leave;
}
if(!CreateProcess(procPath, args, NULL, NULL, FALSE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi))
{
    __leave;
}

// Some minor changes

SetEvent(hEvent);

if (hEvent != NULL)
{
    CloseHandle(hEvent);
}
WaitForSingleObject( pi.hProcess, 60000); // wait 60 seconds

第二道工序:

hEvent = OpenEvent(EVENT_ALL_ACCESS, FALSE, L"MyEvent");
if (NULL == hEvent)
{
   LOG_ERROR(L"[%d] OpenEvent MyEvent\n", GetLastError());
   return;
}
WaitForSingleObject(hEvent, 10000);

【问题讨论】:

  • 你不能这样调用 CloseHandle() ,子进程永远没有机会看到它。在 WaitForSingleObject() 调用之后移动它是显而易见且正确的解决方案。尽管 60 秒也是盲目猜测。

标签: c winapi events process


【解决方案1】:

只需将CloseHandle 调用移到WaitForSingleObject 调用之后。

这样,您的第二个进程将在第一个进程关闭之前打开事件。

如果你不这样做,第一个进程可能会在第二个进程打开之前关闭事件,系统将销毁该事件,因为它已经没有打开的句柄了。然后第二个进程将报告该事件不存在。

此外,您的第一个进程可以使用 INFINITE 而不是 60 秒。

【讨论】:

  • 谢谢。我已经移动了 CloseHandle,现在它工作正常。我等不及 INFINITE 等待第二个进程结束,我不能冒险被困在那个等待中。如果超时,我知道如何继续我的工作,但感谢您的提示。 :)
  • 如果改为两次调用CreateEvent会不会不同?
猜你喜欢
  • 1970-01-01
  • 2016-05-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多