2013-07-15 9 views
6

Normalmente se sono in una funzione intensa di processo, posso chiamare QCoreApplication::processEvents() o QEventLoop::processEvents() per garantire che il mio processo non blocchi altri segnali e slot.Come posso elaborare eventi su QThread?

Tuttavia, se creo un nuovo QThread e passare a un lavoratore di quel filo, quindi non ho un QCoreApplication o un QEventLoop con cui chiamare processEvents().

Dalla mia ricerca, sembra che dovrei essere in grado di installare un QEventLoop sul nuovo QThread ho creato, e poi posso chiamare processEvents() su quel QEventLoop.

Tuttavia, non riesco a capire come farlo. Immagino potrebbe sembrare qualcosa del genere:

QThread *thread = new QThread(this); 
Worker *worker = new Worker(this); 
QEventLoop *loop = new QEventLoop(); 

connect(thread, SIGNAL(finished()), worker, SLOT(deleteLater())); 
connect(thread, SIGNAL(finished()), thread, SLOT(deleteLater())); 
connect(thread, SIGNAL(started()), worker, SLOT(startProcessing())); 
connect(worker, SIGNAL(done()), thread, SLOT(quit())); 
connect(worker, SIGNAL(done()), loop, SLOT(quit())); 

worker->moveToThread(thread);  

//loop->exec() // blocks processing of this thread 
loop->moveToThread(thread); 

//loop->exec() // loop is not a member of this thread anymore and even 
       // if it was, this would block the thread from starting 
thread->start(); 
//loop->exec(); // loop is not a member of this thread anymore and even 
       // if it was, this would block this thread from continuing 

Ogni luogo in cui provo ad avviare il ciclo presenta qualche tipo di problema. Ma anche se qualcosa di simile funzionasse, come potrei chiamare lo processEvents() su quello QEventLoop()?

In alternativa, QThread ha anche una funzione setEventDispatcher() e QAbstractEventDispatcher ha una funzione processEvents(), ma io non riesco a trovare nulla che le sottoclassi QAbstractEventDispatcher.

Qual è il modo corretto di elaborare gli eventi durante una funzione di lavoro intensivo su un QThread?

risposta

13

Secondo la documentazione, chiamare QCoreApplication::processEvents() elabora gli eventi per qualsiasi thread chiamato.

+2

Ah! Grazie! Ho pensato che per usare 'QCoreApplication :: processEvents()' avrei dovuto creare un nuovo 'QCoreApplication'. Ma sembra che il mio 'QThread' fa ancora parte del preesistente' QCoreApplication'. –

+0

non si rese conto che era un metodo statico. Grazie. –

-6

Tuttavia, se creo un nuovo QThread e passare a un lavoratore di quel filo, quindi non ho un QCoreApplication o un QEventLoop con cui chiamare processEvents().

Esattamente - non chiamarlo. Non ne hai bisogno, non lo vuoi.

+3

Quindi ... come posso elaborare gli eventi su un 'QThread'? –

Problemi correlati