2015-01-14 21 views
5

ho fatto la mia diligenza, ma non riesco a trovare una risposta a questo:Utilizzando Qt segnali/slot con fili non Qt

Come funziona il meccanismo/slot di Qt segnale interagiscono con le discussioni non-Qt?

In particolare, è sicuro emettere un segnale da un thread non Qt (ad esempio TBB), per essere catturato da uno slot nel mio ciclo degli eventi principale? Supponiamo che lo connetti esplicitamente con una connessione in coda? (La mia sensazione è che specificare che la connessione sia in coda sarebbe obbligatoria, è corretto?)

(come domanda a parte, ho assunto che in generale le classi di sincronizzazione Qt, ad esempio QMutex, funzionino su Qt thread. È corretto?)

(Come commento di chiarimento, la cosa di cui sono preoccupato è che il meccanismo di connessione in coda non utilizzerà guardie, ad esempio mutex, per aggiungere il metacall alla coda eventi thread principale se non rileva che il segnale viene emesso da un thread Qt diverso.)

(Aggiunta finale: posso crederlo perché i meccanismi Qt sono implementati in termini di piattaforma- . Primitivi specifici, che in pratica tutte le cose che sto cercando di fare sarà solo lavorare con grazia, ma mi chiedo anche se Qt fornisce alcuna garanzia che queste cose funzionano)

risposta

9

I documentation stati:

Nota: Le classi di threading di Qt sono implementate con API native di threading; ad es. Win32 e pthreads. Pertanto, possono essere utilizzati con i thread della stessa API nativa.

Quindi sì, i mutex di Qt funzioneranno con altri thread (purché utilizzino anche la stessa API nativa).

La differenza tra i thread Qt e altri thread è che altri thread non avranno mai il ciclo di eventi di Qt in esecuzione, quindi non sarà in grado di ricevere e gestire alcun segnale. Tuttavia, se si esegue il ciclo degli eventi (exec) all'interno di tale thread, tutto dovrebbe funzionare correttamente.

funzioni relativo segnale, principalmente processEvents e si dice che siano thread-safe:

Nota: Questa funzione è thread-safe.

Se gli oggetti hanno l'affinità filo impostato correttamente (utilizzando il metodo moveToThread) non è necessario impostare il tipo il collegamento in modo esplicito, il default AutoConnection funziona come segue:

(default) Se il segnale viene emesso nel thread che l'oggetto ricevente ha affinità, quindi il comportamento è lo stesso della connessione diretta. In caso contrario, il comportamento è identico alla connessione in coda.

This answer suggerisce che filetti non Qt dovrebbero essere correttamente identificabile mediante metodi di Qt - currentThread deve restituire un'istanza QThread anche per un filo non-Qt, dato che è solo un involucro sopra thread nativi.