2012-10-16 41 views
0

我有两个进程,一个使用C#创建,另一个使用本机C++创建。跨进程同步在托管进程中使用EventWaitHandle,在非托管进程中使用WaitForSingleObject

我想同步这两个进程,以便非托管人将被阻塞,直到托管人启动并运行。

在管理过程中,我有以下代码:

// 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无法检测到,并且一直等到超时。

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

回答

1

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

+0

谢谢。现在我使用HANDLE hWaitEvent = OpenEventW(NULL,TRUE,eventName);开启活动。但是hWaitEvent为null。我是否需要指定第一个参数而不是NULL? – sean717

+0

使用GetLastError()。你的论点很随意,你需要询问SYNCHRONIZE访问权限。如果这两个进程在不同的会话中(如服务),那么您需要在事件名称前添加“Global \”。 –

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); 
    } 
相关问题