Can Events be Inter-Process?
我已经在一个进程中创建了一个事件并进行测试,然后通过管道将事件句柄发送到一个完全独立的进程(而不是子线程)。
当我第一次触发该事件时,WaitForSingleObject不会检测到该事件,因此我猜答案是否定的,除非我错过了SECURITY_ATTRIBUTES结构中的某些技巧?
或者也许我需要使用命名事件并调用OpenEvent()?
在这种情况下,我无法使用窗口消息,因为我试图向Windows服务发出信号。我可以使用管道,但是会有许多这样的应用程序,如果可能的话,我想找到一个"低成本"的解决方案。
诸如内存映射文件之类的其他选项比管道具有更多的开销吗?
您将如何做?
您需要创建一个命名事件并在两个进程中都将其打开。如果您有多个进程正在监听,则可以考虑使用信号量。
是这样的:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | #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
事件