2009-03-09 6 views
6

j'ai créé un événement dans un processus et pour tester, envoyé la poignée de l'événement par l'intermédiaire d'un tuyau à un procédé totalement distinct (pas un thread enfant)Les événements Can peuvent-ils être inter-processus?

Quand je déclencher l'événement dans le premier, WaitForSingleObject ne détecte pas la événement donc je suppose que la réponse est non, sauf si j'ai raté un truc dans le SECURITY_ATTRIBUTES structure?

Ou peut-être que je dois utiliser un événement nommé et appeler OpenEvent()?

Dans ce cas, je ne peux pas utiliser les messages de fenêtre parce que j'essaie de signaler un service Windows. Je pourrais utiliser le tuyau, mais il y aura beaucoup de ces applications, et je voudrais trouver une solution "low cost" si possible.

D'autres options comme les fichiers mappés mémoire ont encore plus de frais généraux que le tuyau?

Comment voulez-vous faire cela?

Répondre

3

Vous devez créer un événement nommé et l'ouvrir dans les deux processus. Si vous avez plusieurs processus d'écoute, vous pouvez envisager d'utiliser un semaphore.

+0

Si la Les événements nommés sont utilisés par différents comptes ou sessions d'utilisateurs, peuvent être nécessaires pour fournir une liste de contrôle d'accès explicite à la création. – Richard

+0

Avez-vous un exemple de cela? –

0

Oui cela fonctionne:

#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 général, ce qui a une baisse des frais généraux:

Pipes (en supposant que la petite taille spécifiée)

MemMapFiles

Events

+0

Frais généraux en termes de mémoire ou de temps de traitement? –

+0

Je voudrais comprendre l'impact sur ces deux ressources. –

Questions connexes