2012-06-27 29 views
5

Stavo analizzando un codice sorgente su cui sto lavorando. Ho trovato una dichiarazione particolare che qualcuno aveva codificato. Il codice sorgente è un'applicazione GUI con una GUI QML e utilizza QT 4.7.x.La classe basata su QObject ha una connessione accodata a se stessa

Lo snippet di seguito appartiene alla logica dell'applicazione principale.

// connect signal-slots for decoupling 
QObject::connect (this, SIGNAL(setCurrentTaskSignal(int)), this, 
    SLOT(SetCurrentTaskSlot(int)), Qt::QueuedConnection); 

È strano che l'oggetto si collega a se stesso tramite una connessione coda che significa in sostanza che l'oggetto può "vivo" in diversi thread contemporaneamente?

A prima vista non aveva alcun senso per me. Qualcuno può pensare a qualche motivo per cui una tale connessione sarebbe plausibile o necessaria? Funzionerebbe anche questo?

risposta

9

Funzionerà senza problemi. Forse prima del richiamo di SetCurrentTaskSlot è stata richiesta l'elaborazione del ciclo di eventi?

Si noti che QueuedConnection non significa che qualcosa è in thread diversi. QueuedConnection significa solo che quando viene emesso un segnale, lo slot corrispondente non verrà chiamato direttamente. Sarà accodato al ciclo degli eventi e verrà elaborato quando il controllo verrà restituito al ciclo degli eventi

+0

Ha senso. Sto ancora guardando le cose che circondano il codice. Quindi tornerò una volta che è chiaro cosa sta succedendo. –

+1

Quindi sembra che un segnale di cambio attività venga emesso mentre si esegue un calcolo e che "modifica" non dovrebbe avvenire immediatamente, ma dopo che il flusso corrente è stato eseguito e l'elaborazione dell'evento riprende. –

3

La connessione in coda non implica nulla su dove risiede il ricevitore. È vero il contrario: per inviare in modo sicuro segnali a un oggetto che vive in un altro thread, è necessario utilizzare connessioni in coda. Ma puoi usarli per un oggetto che vive in qualsiasi thread!

Uno utilizza una connessione in coda per garantire che il segnale venga recapitato dall'interno del ciclo di eventi e non immediatamente dal sito di emissione come accade con la connessione diretta. La connessione diretta è concettualmente un insieme di chiamate a puntatori di funzione su un elenco. La connessione in coda è concettualmente un evento inviato a un ricevitore intelligente che può eseguire una chiamata di funzione in base al contenuto dell'evento.

L'evento è il QMetaCallEvent interno ed è QObject::event che agisce su questo evento ed esegue la chiamata.