我在一个进程中创建了一个事件并进行测试,通过管道将事件句柄发送到一个完全独立的进程(而不是子线程)
当我在第一个事件中触发事件时,WaitForSingleObject没有检测到事件,因此我猜测答案是否定的,除非我错过了SECURITY_ATTRIBUTES structure?
中的一些技巧或许我需要使用命名事件并调用OpenEvent()?
在这种情况下,我无法使用窗口消息,因为我试图发出Windows服务信号。我可以使用管道,但是会有很多这样的应用程序,如果可能的话我想找到一个“低成本”的解决方案。
内存映射文件等其他选项的开销比管道还要多吗?
你会怎么做?
答案 0 :(得分:3)
您需要创建一个命名事件并在两个进程中打开它。如果您正在侦听多个进程,则可以考虑使用semaphore。
答案 1 :(得分: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
活动