2013-06-07 16 views
6

Vorrei confermare ciò che ritengo sia un aspetto diretto dei thread di lavoro in Qt.In Qt, il blocco del ciclo di eventi di QThread si verifica mentre è in esecuzione uno slot su un oggetto QO di proprietà del thread del ciclo di eventi?

Supponiamo di creare un QThread il cui scopo è gestire il lavoro dispendioso in termini di tempo nel thread corrispondente. Supponiamo inoltre che consenta l'esecuzione del ciclo degli eventi corrispondente di questo thread chiamando start() sul QThread. Il lavoro stesso viene eseguito da una funzione membro (slot) che viene segnalata dal segnale started() di QThread.

Che è (copia da https://stackoverflow.com/a/11039216/368896):

class Task : public QObject 
{ 
Q_OBJECT 
public: 
    Task(); 
    ~Task(); 
public slots: 
    void doWork() 
    { 
     //very time-consuming code is executed here before the next line is reached... 
     emit workFinished(); // Calls workFinished() signal (after a long time) 
    } 
signals: 
    void workFinished(); 
}; 

// ... in the main thread: 
QThread *thread = new QThread(); 
Task *task = new Task(); 
task->moveToThread(thread); 
connect(thread, SIGNAL(started()), task, SLOT(doWork())); 
connect(task, SIGNAL(workFinished()), thread, SLOT(quit())); 
//automatically delete thread and task object when work is done: 
connect(thread, SIGNAL(finished()), task, SLOT(deleteLater())); 
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); 
thread->start(); 

La mia domanda è la seguente. Comprendo che il ciclo degli eventi del thread di lavoro riceverà un trigger dal segnale finished() per chiamare lo slot deleteLater() nell'istanza task. Inoltre, questo ciclo di eventi verrà eseguito poco dopo la restituzione della funzione doWork() e pertanto sarà pronto e disponibile per elaborare il trigger dal segnale finished() che è stato appena aggiunto alla coda eventi del thread di lavoro dalla chiamata a finished() alla fine della funzione doWork().

vorrei confermare che durante l'intero corso dell'operazione di tempo che viene eseguito all'interno doWork() (prima finished() è emessa e prima la funzione termina doWork()), che il ciclo degli eventi all'interno del thread di lavoro è bloccato sulla la funzione slot doWork() e quindi il thread di lavoro sarà NON essere reattivo a qualsiasi slot attivato su qualsiasi oggetto di proprietà del thread del ciclo di eventi durante l'intero corso dell'esecuzione della funzione doWork() che richiede tempo. (E che quindi, tali slot saranno eseguiti solo dopo doWork() uscite, una volta ciclo di eventi del thread lavoratore è di nuovo attivo, e prima che il grilletto dal segnale finished() viene gestito.)

ho il sospetto che questo è il caso, ma voglio confermarlo

Grazie!

risposta

7

Il ciclo di eventi del thread di lavoro verrà bloccato, ovvero non sarà possibile elaborare alcun evento (inclusi quelli utilizzati per le connessioni "in coda" tra segnali e slot, che è ciò che si ottiene quando si fa il segnale -slot connessioni tra thread) a meno che tu non attivi esplicitamente una chiamata all'oggetto loop evento.

Tuttavia è possibile avere ancora slot eseguiti nel thread di lavoro attivati ​​da segnali emessi dal thread di lavoro, poiché si tratta di chiamate di funzione semplici e non richiedono un ciclo di eventi in esecuzione.