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
?
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'. –
non si rese conto che era un metodo statico. Grazie. –