1

我有两个进程,一个使用 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 无法检测到这一点,并始终等到超时。

有什么我错过的吗?谢谢。

4

2 回答 2

3

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);
    }
于 2012-10-17T21:43:39.093 回答
1

是的,这不起作用,您正在两端创建一个事件。其中一个必须创建它,另一个必须打开它。C++ 代码中的 OpenEvent() 或 C# 代码中的 EventWaitHandle.OpenExisting()。无论代码首先开始,都必须创建事件。

于 2012-10-17T00:11:55.413 回答