1

2 つのプロセスがあります。1 つは C# を使用して作成され、もう 1 つはネイティブ C++ を使用して作成されます。

2 つのプロセスを同期させて、管理されているプロセスが起動して実行されるまで、管理されていないプロセスがブロックされるようにしたいと考えています。

管理されたプロセスには、次のコードがあります。

// 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

はい、それは機能しません。両端でイベントを作成しています。そのうちの 1 人はそれを作成し、もう 1 人はそれを開く必要があります。C++ コードの OpenEvent() または C# コードの EventWaitHandle.OpenExisting()。どのコードが最初に開始されても、イベントを作成する必要があります。

于 2012-10-17T00:11:55.413 に答える