Utilità del metodo processEvents



  • Ciao a tutti,

    sono relativamente nuovo nel mondo di Qt e ormai completamente arrugginito in fatto di programmazione a oggetti.
    Sto cercando di realizzare un sistema di comunicazione tra un PC e dei dispositivi esterni (basati su micro controllori) e mi occorre una mano per riuscire a capire che errore sto facendo nella gestione della comunicazione seriale.

    In particolare non capisco in che modo il metodo processEvents possa influire sul comportamento del mio software...

    Mi spiego meglio...

    Ho la necessità di inviare dei frame ai miei dispositivi e a seguito dell'invio dei frame, devo ricevere in risposta due pacchetti:
    un primo pacchetto mi dice se il dispositivo remoto è raggiungibile
    il secondo è l'effettiva risposta del dispositivo remoto

    Considerato che in una libreria che ho trovato online mi sono imbattuto nel metodo processEvents, allora mi chiedevo in che modo influisse sul flusso del mio software.
    Queste sono le righe di codice :

    QTime dieTime= QTime::currentTime().addMSecs(timeoutSerial);
        while( QTime::currentTime() < dieTime )
            QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
    

    Qualcuno gentilmente potrebbe spiegarmi quale sia l'effettiva necessità di processEvents?
    Inoltre quel "100" a cosa fa riferimento?
    Ho cercato anche nell'help di Qt ma non riesco a comprendere al 100% l'utilità.

    vi ringrazio per il supporto e per qualsiasi informazione,
    a presto,
    Mik



  • Ciao,

    processEvents() e' in generale utile quando il tuo software sta eseguendo un'operazione che richiede molto tempo e vuoi rilasciare le risorse per un po' (ad esempio per permettere il refresh dell'interfaccia grafica). Il secondo parametro indica il tempo massimo (in millisecondi) che il metodo puo' impiegare. In pratica stai dicendo all'applicazione di processare tutto gli eventi pending per 100ms.

    Il tuo codice specifico processa tutti gli eventi fino a quando si raggiunge un determinato datetime.

    Non conosco il tuo codice ma un'alternativa potrebbe essere quella di eseguire operazioni lunghe in Thread separati (per esempio usando un QThreadPool).



  • Ciao e grazie per la spiegazione.

    Nel mio caso mi occupo di comunicazioni seriali e mi sono imbattuto nel metodo che mi hai descritto tu!
    Ho notato anche che esistono diversi tipi di trattazioni in Qt, come le due modalità blocking e non-blocking ma non ho capito bene come sfruttarle nel mio software.
    Purtroppo non ho alcuna esperienza in programmazione multi thread, per cui sono un tantino spiazzato!

    Vorrei che la mia applicazione riuscisse a inviare i frame desiderati e a ricevere le opportune risposte dai vari dispositivi, potendo gestire eventualmente gli errori di comunicazione (ad es. dispositivo che non risponde) ma ho davvero difficoltà a capire come gestire il tutto.

    Ho provato a creare una banale applicazione che invia i dati e attende la risposta (qualsiasi risposta) via seriale ma non mi pare funzioni bene!
    Qualche suggerimento?

    Grazie ancora,
    Mik


Log in to reply
 

Looks like your connection to Qt Forum was lost, please wait while we try to reconnect.