2013-05-08 99 views
0

我刚刚开始在Windows上使用Qt并阅读有关moveToThread()函数。如果我这样写:Qt C++ moveToThread()

class Worker : public QObject 
{ 
    Q_OBJECT 
private: 
    QThread* thread; 
public: 
    void GoToThread() { 
     thread = new QThread(); 
     this->moveToThread(thread); 
    } 
    void DoWork() { 
     //long work 
    } 
}; 

Worker* w = new Worker(); 
w->GoToThread(); 
w->DoWork(); 

这段代码到底会做什么?它会把自己放到线程中吗?我可以在外面打电话给DoWork()吗?

回答

3

在你给出的例子中,DoWork()将在调用者的线程上执行。

如果你想DoWork()要在Worker对象的线程上完成的,你应该有DoWork()是可以通过发光,它已经连接到或致电QMetaObject::invokeMethod()到的信号来调用插槽“叫”吧。

基本上,将Q_OBJECT移动到另一个线程会使Q_OBJECT使用与该线程关联的事件队列,因此通过事件队列传递给该对象的任何事件都将在该线程上处理。

3

这将QObject的移动到新的线程,在什么迈克尔·伯尔已经说了,因为你错过了,你应该看看文档here在顶部至少一个连接线程完成对deleteLater您的QObject(这会造成内存泄漏)