我已经在一个进程中创build了一个事件,并通过pipe道将事件句柄发送到一个完全独立的进程(而不是一个子线程)
当我在第一个触发事件时,WaitForSingleObject不检测事件,所以我猜测答案是否定的,除非我错过了SECURITY_ATTRIBUTES结构中的一些技巧?
或者也许我需要使用一个命名的事件,并调用OpenEvent()?
在这种情况下,我不能使用窗口消息,因为我试图发信号给一个Windows服务。 我可以使用pipe道,但会有很多这样的应用,如果可能的话,我想find一个“低成本”的解决scheme。
像内存映射文件的其他选项比pipe道更多的开销?
你会怎么做?
您需要创建一个命名事件并在两个进程中打开它。 如果你有多个进程监听,你可以考虑使用一个信号量 。
是的,这工作:
#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
活动