【问题标题】:Can Events be Inter-Process?事件可以跨进程吗?
【发布时间】:2010-10-12 03:34:38
【问题描述】:

我在一个进程中创建了一个事件并进行测试,通过管道将事件句柄发送到一个完全独立的进程(不是子线程)

当我第一次触发事件时,WaitForSingleObject 没有检测到该事件,所以我猜答案是否定的,除非我错过了SECURITY_ATTRIBUTES structure? 中的一些技巧

或者我可能需要使用命名事件并调用 OpenEvent()?

在这种情况下,我无法使用窗口消息,因为我试图向 Windows 服务发出信号。我可以使用管道,但会有很多这样的应用程序,如果可能的话,我想找到一个“低成本”的解决方案。

诸如内存映射文件之类的其他选项比管道的开销更大?

你会怎么做?

【问题讨论】:

    标签: c++ windows events ipc


    【解决方案1】:

    您需要创建一个命名事件并在两个进程中打开它。如果你有多个进程在监听,你可以考虑使用semaphore

    【讨论】:

    • 如果命名事件由不同的用户帐户或会话使用,可能需要在创建时提供显式 ACL。
    • 你有这样的例子吗?
    【解决方案2】:

    是的,这行得通:

      #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
    

    一般来说,开销较低:

    管道(假设指定小尺寸)

    内存映射文件

    活动

    【讨论】:

    • 内存或处理时间方面的开销?
    • 我想了解对这两种资源的影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-02-05
    • 1970-01-01
    • 2011-03-06
    • 1970-01-01
    • 2010-11-05
    • 1970-01-01
    • 2011-10-21
    相关资源
    最近更新 更多