7

1つのプロセスでイベントを作成し、テストするために、パイプを介して完全に別のプロセス(子スレッドではない)にイベントハンドルを送信しました

最初にイベントを発生させたとき、WaitForSingleObjectはイベントを検出しないので、SECURITY_ATTRIBUTES構造体のトリックを見逃さない限り、答えはノーだと思いますか?

または、名前付きイベントを使用してOpenEvent()を呼び出す必要がありますか?

この場合、Windowsサービスにシグナルを送信しようとしているため、ウィンドウメッセージを使用できません。パイプを使うこともできますが、これらの用途はたくさんあるので、できれば「低コスト」の解決策を見つけたいと思います。

メモリマップトファイルのような他のオプションには、パイプよりもさらに多くのオーバーヘッドがありますか?

これをどのように行いますか?

4

2 に答える 2

3

名前付きイベントを作成し、両方のプロセスで開く必要があります。複数のプロセスをリッスンしている場合は、セマフォの使用を検討してください。

于 2009-03-09T09:17:38.437 に答える
0

はい、これは機能します:

  #COMPILE EXE "NamedEvent.exe"

  #INCLUDE "win32api.inc" 

  %EVENT_ALL_ACCESS = &h0001F0003

  FUNCTION PBMAIN() AS LONG  

    LOCAL lRet AS LONG, lError AS LONG, lEventName AS ASCIIZ * %MAX_PATH
    lEventName = "TestEvent"
    lRet   = CreateEvent (BYVAL %NULL, %False, %False, lEventName)
    lError = GetLastError ()
    IF ISFALSE lRet THEN
      MSGBOX "Unable to create Event, error:" + STR$(lError),,"CreateEvent error"
    ELSE
      IF lError = %ERROR_ALREADY_EXISTS THEN
        lRet = OpenEvent(BYVAL %EVENT_ALL_ACCESS, %False, lEventName)
        lError = GetLastError()
        IF lRet THEN
          MSGBOX "Opened existing Event, handle:" + STR$(lRet),,"OpenEvent:"
        ELSE
          MSGBOX "Unable to open Event, error:" + STR$(lError),,"OpenEvent error" : EXIT FUNCTION
        END IF
      ELSE
        MSGBOX "Created new Event, handle:" + STR$(lRet),,"CreateEvent:"
      END IF
    END IF    

  END FUNCTION

一般に、オーバーヘッドが低いものは次のとおりです。

パイプ(小サイズ指定前提)

MemMapFiles

イベント

于 2009-03-09T09:40:18.553 に答える