2009-11-14 15 views
18

Se avevo una classe A, in cui una delle sue funzioni fa:Qt: gli eventi vengono elaborati in ordine?

void A::func() 
{ 
    emit first_signal(); 
    emit second_signal(); 
} 

Supponendo che una classe B ha 2 slot, uno collegato al first_signal, e l'altro per second_signal, si è garantito che la lo slot collegato a first_signal verrà sempre elaborato prima dello dello slot second_signal?

risposta

15

Se si utilizza il tipo di connessione diretta tra segnali e slot (Qt :: DirectConnection), la risposta è sì.

Dal sistema di aiuto Qt:

Quando un segnale viene emesso, gli slot ad esso collegati vengono di solito effettuate immediatamente, proprio come una normale chiamata funzione. In questo caso, il meccanismo di segnali e slot è totalmente indipendente da qualsiasi loop di eventi della GUI. L'esecuzione del codice dopo l'emissione dell'emissione si verificherà una volta che tutti gli slot sono stati restituiti. La situazione è leggermente diversa quando si utilizzano le connessioni in coda ; in tal caso, il codice successivo alla parola chiave emetterà lo continuazione immediata e gli slot verranno eseguiti successivamente.

È possibile cambiare il tipo di connessione predefinito per qualsiasi enum Qt::ConnectionType in QObject::connect metodo.

+1

Penso che sarebbe garantito finché hanno lo stesso tipo, anche se non è predefinito. Quella in coda creerebbe due eventi, ciascuno con la stessa priorità, e quegli eventi sarebbero poi elaborati in ordine. Inoltre, il tipo di connessione predefinito è Qt :: AutoConnection, che si risolve in modo tale da far sì che l'emettitore e il destinatario si trovino entrambi nello stesso thread. –

+3

La frase iniziale del tuo post dovrebbe leggere 'Se usi il tipo di connessione DIRETTA tra segnali e slot'; dal momento che il tipo predefinito è 'Qt :: AutoConnection' che si comporta in modo diverso a seconda che il codice di invio e l'oggetto di ricezione siano presenti in thread diversi. Vedi ['Qt :: ConnectionType' docs] (http://qt-project.org/doc/qt-4.8/qt.html#ConnectionType-enum) e [Threads, Eventi e QObjects] (http: // qt- project.org/wiki/Threads_Events_QObjects). – Hossein

+2

Se si è scelto Qt :: QueuedConnection (o Qt :: AutoConnection e lo slot era in un thread diverso rispetto al segnale), ovviamente lo slot verrebbe chiamato in modo asincrono, ma penso che la domanda continui "È garantito che lo slot quello che è collegato a first_signal sarà sempre processato prima dello slot secondo_signal? " Qualcuno ha una risposta? –

Problemi correlati