Qt C ++ moveToThread()

时间:2013-05-08 08:47:06

标签: c++ multithreading qt

我刚开始在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()吗?

2 个答案:

答案 0 :(得分:3)

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

如果你想在DoWork()对象的线程上完成Worker,你应该让DoWork()成为一个可以通过发出已连接到的信号来调用的插槽或致电QMetaObject::invokeMethod()来“召唤”它。

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

答案 1 :(得分:3)

这会将QObject移动到新线程,并且除了 Michael Burr 之外已经说过你应该查看文档here,因为你至少错过了一个连接线程删除LObject for your QObject(这会导致内存泄漏)