Visualizzazione dei risultati da 1 a 5 su 5
  1. #1

    [C++] Event e WaitForSingleObject

    Ciao a tutti,
    ho uno strano problema con la condivisione di un evento tra diversi threads.
    Illustro subito un esempio:

    codice:
    void main(){
      HANDLE killServiceEvent = CreateEvent (0, TRUE, FALSE, _T("NOME_EVENTO"));
      if (!killServiceEvent) return;
    
      CreateThread(0, 0, (LPTHREAD_START_ROUTINE) ServiceThread, 0, 0, NULL);
      WaitForSingleObject (killServiceEvent,INFINITE)
      ...
    }
    
    void ServiceThread(){
      HANDLE killServiceEvent = OpenEvent (EVENT_MODIFY_STATE, FALSE, _T("NOME_EVENTO"));
      if (!killServiceEvent) return;
        WaitForSingleObject (killServiceEvent,INFINITE); // Non si ferma qui.. perchè?
        .....
    }
    L'esempio è molto semplice: ho un main che crea un evento e si mette in attesa della terminazione del thread e dell'evento (e funziona perfettamente), poi ho un servizio che accede all'evento creato dal main e attende che diventi segnalato (compito che svolge un altro thread su richiesta utente). Il problema è che nel ServiceThread, la funzione WaitForSingleObject non attende quindi non si aspetta che l'evento diventi segnalato.

    E' strano perchè l'evento è corretto (se provo a cambiare nome su OpenEvent, killServiceEvent diventa null) e anche se scrivo sul thread:

    ResetEvent(killServiceEvent);
    WaitForSingleObject (killServiceEvent,INFINITE);

    il WaitForSingleObject procede senza problemi.

    Ho provato a mettere WaitForSingleObject (killServiceEvent,INFINITE) sul main, subito dopo la creazione.. e lì si blocca tranquillamente quindi funziona.

    Spero mi aiutiate.. grazie in anticipo

  2. #2
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Credo sia sbagliato EVENT_MODIFY_STATE
    Per gli Spartani e Sparta usa spartan Il mio github

  3. #3
    Ciao, grazie per la risposta,
    quel parametro è corretto perchè all'interno del thread ho la necessità di poter modificare l'evento.

    Comunque credo di aver trovato il problema dalla documentazione msdn:

    codice:
    HANDLE WINAPI CreateEvent(
      _In_opt_  LPSECURITY_ATTRIBUTES lpEventAttributes,
      _In_      BOOL bManualReset,
      _In_      BOOL bInitialState,
      _In_opt_  LPCTSTR lpName
    );
    lpEventAttributes [in, optional]
    A pointer to a SECURITY_ATTRIBUTES structure. If this parameter is NULL, the handle cannot be inherited by child processes.

    Questo spiegherebbe perchè riesco a gestire tranquillamente l'evento dal main, ma non ho accesso dal thread child. Devo creare un oggetto con i diritti di condivisione per i figli.

  4. #4
    Utente di HTML.it L'avatar di linoma
    Registrato dal
    Mar 2010
    Messaggi
    1,346
    Di openevent se controlli le funzioni di wait richiedono l'attributo syncronize. E controlla di risultato del wait nel thread per capire eventuali errori.
    Per gli Spartani e Sparta usa spartan Il mio github

  5. #5
    Funziona! Grazie mille!!

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.