我刚开始在Windows上使用Qt并阅读有关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()吗?
答案 0 :(得分:3)
在您给出的示例中,DoWork()
将在调用者的线程上执行。
如果你想在DoWork()
对象的线程上完成Worker
,你应该让DoWork()
成为一个可以通过发出已连接到的信号来调用的插槽或致电QMetaObject::invokeMethod()
来“召唤”它。
基本上,将Q_OBJECT
移动到另一个线程会使Q_OBJECT
使用与该线程关联的事件队列,因此通过事件队列传递给该对象的任何事件都将在该线程上处理。 / p>
答案 1 :(得分:3)
这会将QObject移动到新线程,并且除了 Michael Burr 之外已经说过你应该查看文档here,因为你至少错过了一个连接线程删除LObject for your QObject(这会导致内存泄漏)