c++ - Qt queued exit event for worker object in another thread -


myclass object has worker qobject, working in thread:

class myclass { .... private:    qthread thread;    worker worker; // inherits qobject };  ...  worker.movetothread(&thread); 

now when call thread.exit() worker thread stops instantly. prefer finish pending events, quit.

i have tried "queued exit":

connect(this, signal(signalfinish()),         &thread, slot(quit()),qt::queuedconnection);   ...  void myclass::finish() {     emit signalfinish();     worker.disconnect(); // not queue more events     thread.wait(); } 

but doesn't work. wait forever...

how stop qthread after it's event loop process pending events?

the thread , myclass instances both live in same thread - main thread:

myclass::myclass() {   ...   q_assert(this->thread() == thread.thread()); 

yet events you're queuing worker object go worker thread:

  worker.movetothread(&thread);   q_assert(worker.thread() == &thread);   q_assert(worker.thread() != thread.thread()); 

the queued connection precisely wrong thing because wait on worker thread, main thread's event loop won't run , won't issue more events thread. quit call never delivered, since it's delivered in main thread, main thread blocked.

instead, take advantage of quit being thread-safe method. call worker thread itself:

//                                    vvvvvvv thread context object call connect(this, &myclass::signalfinish, &worker, [this]{ thread.quit(); }); // `quit()` execute in `worker.thread()` 

note thread context object object thread() call executed in. should not qthread instance, in cases!

when signalfinish emitted, qmetacallevent carrying functor above queued in worker thread's queue, , executed after existing call (and other) events processed first.

since you're calling finish in main thread, don't want wait on thread since block gui , make application unresponsive.

as seems you're submitting job items worker thread, might better served qtconcurrent::run submits job items thread pool, , thread management you. see this answer complete example. see this answer , that answer related tidbits.


Comments

Popular posts from this blog

sequelize.js - Sequelize group by with association includes id -

android - Robolectric "INTERNET permission is required" -

java - Android raising EPERM (Operation not permitted) when attempting to send UDP packet after network connection -