事件可以跨进程吗?

7
我在一个进程中创建了一个事件,并通过管道将事件句柄发送到完全独立的进程(不是子线程)。当我在第一个进程中触发事件时,WaitForSingleObject无法检测到该事件,因此我猜答案是否定的,除非我在SECURITY_ATTRIBUTES结构体中错过了一些技巧?或者我需要使用命名事件并调用OpenEvent()?在这种情况下,我不能使用窗口消息,因为我正在尝试向Windows服务发出信号。我可以使用管道,但会有许多这样的应用程序,如果可能,我想找到“低成本”的解决方案。其他选项,如内存映射文件,比管道的开销更大吗?你会怎么做?
2个回答

3

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


如果命名事件被不同的用户帐户或会话使用,则可能需要在创建时提供显式ACL。 - Richard
你有这方面的例子吗? - Mike Trader

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

一般来说,哪种开销较小:

管道(假设指定了小尺寸)

内存映射文件

事件


在内存或处理时间方面的开销? - i_am_jorf
我想了解这两个资源的影响。 - Mike Trader

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接