我有两个进程,一个使用C#创建,另一个使用本机C ++创建。
我想同步这两个进程,以便阻止非托管进程,直到托管进程启动并运行。
在托管流程中,我有以下代码:
// signal the unmanaged process that I am up and running
EventWaitHandle eventWaitHandle = new EventWaitHandle(false, EventResetMode.ManualReset, "MyEventName");
eventWaitHandle.Set();
在非托管进程中,我有相应的代码来等待事件
HANDLE hWaitEvent = CreateEventW(NULL, TRUE, FALSE, "MyEventName");
if (hWaitEvent)
{
// wait for managed process to signal that it is up and running
WaitForSingleObject(hWaitEvent, 5000);
}
据我所知,在第一个过程中设置了事件。另一个进程中的WaitForSingleObject无法检测到该状态,并始终等待超时。
我错过了什么吗?感谢。
答案 0 :(得分:2)
Hans Passant建议的是对的,我在C ++中打开事件时需要SYNCHRONIZE访问权。
以下是有效的代码:
在托管流程中:
EventWaitHandle _initializedEvent = new EventWaitHandle(false, EventResetMode.ManualReset, @"Global\Initialized");
在原生过程中:
const WCHAR* initializedEventName = L"Global\\Initialized";
int attempt = 0;
HANDLE eventHandle = NULL;
while ((eventHandle = OpenEventW(SYNCHRONIZE, FALSE, initializedEventName)) == NULL && attempt < 5)
{
Sleep(1000);
++attempt;
}
if (eventHandle != NULL)
{
WaitForSingleObject(eventHandle, 5000);
CloseHandle(eventHandle);
}
答案 1 :(得分:1)
是的,这不起作用,您正在两端创建一个事件。其中一个必须创建它,另一个必须打开它。 C ++代码中的OpenEvent()或C#代码中的EventWaitHandle.OpenExisting()。无论什么代码首先启动都必须创建事件。