0

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

4

2 回答 2

3

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

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

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

于 2013-05-08T08:53:14.890 回答
3

这会将 QObject 移动到新线程,并且在Michael Burr已经说过的内容之上,您应该查看此处的文档,因为您至少错过了一个为您的 QObject 完成 deleteLater 的连接线程(这将导致内存泄漏)

于 2013-05-08T08:55:44.893 回答