Qt:转向线程

时间:2015-01-23 08:49:07

标签: c++ multithreading qt

说我是否有:

Class A{
Q_Object

public:
A::A(){};
void A::init(){obj = new myQobject();}
myQobject* obj;
}

然后如果使用类A:

QThread *workerthread = new QThread;
A *worker = new A();
worker->moveToThread(workerthread);
workerthread->start();
worker->init();

那么 myQobject obj 会生活在哪个线程中?主线程还是工作线程?

1 个答案:

答案 0 :(得分:2)

它将存在于主线程中,因为您从主线程调用worker->init()。您可以使用信号和插槽从工作线程中调用init,也可以使用QMetaObject::invokeMethod与排队连接(您不必指定此项,因为它将使用{ {1}}默认情况下,如果从与接收对象不同的线程调用Qt::AutoConnection,则会使用Qt::QueuedConnection

invokeMethod

您还可以在构造函数中创建QMetaObject::invokeMethod(worker, "init", Qt::QueuedConnection); 并将myObject设置为父级。然后,当您调用moveToThread时,该对象也会将其子项移动到同一个线程。

thisChanges the thread affinity for this object and its children.