2009-03-09 14 views
6

He creado un evento en un solo proceso y para probar, enviado el identificador de evento a través de una tubería a un proceso totalmente separado (no un hilo hijo)¿Pueden los eventos ser entre procesos?

Cuando desencadenar el evento en la primera, WaitForSingleObject no detecta la evento así que supongo que la respuesta es no, a menos que me perdí algún truco en el SECURITY_ATTRIBUTES structure?

O tal vez necesito usar un evento con nombre y llamar OpenEvent()?

En este caso, no puedo usar mensajes de ventana porque estoy intentando señalar un servicio de Windows. Podría usar la tubería, pero habrá muchas de estas aplicaciones, y me gustaría encontrar una solución de "bajo costo" si es posible.

¿Otras opciones como los archivos de memoria asignados tienen incluso más sobrecarga que la tubería?

¿Cómo harías esto?

Respuesta

3

Debe crear un evento con nombre y abrirlo en ambos procesos. Si tiene múltiples procesos escuchando, puede considerar usar un semaphore.

+0

Si el eventos nombrados son utilizados por diferentes cuentas de usuario o sesiones, puede ser necesario proporcionar una ACL explícita en la creación. – Richard

+0

¿Tiene un ejemplo de eso? –

0

Si esto funciona:

#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 

En general, lo que tiene una sobrecarga más baja:

Tubos (suponiendo pequeño tamaño especificado)

MemMapFiles

Eventos

+0

¿Sobrecarga en términos de memoria o tiempo de procesamiento? –

+0

Me gustaría entender el impacto en ambos recursos. –

Cuestiones relacionadas