QObject::moveToThread中的移动语义

Move semantics in QObject::moveToThread

本文关键字:移动 语义 moveToThread QObject      更新时间:2023-10-16

在QThread类的文档中,一个示例设置的工作原理如下:

public:
Controller() {
    Worker *worker = new Worker;
    worker->moveToThread(&workerThread);
    //some connects to thread and worker
    workerThread.start();
}
~Controller() {
    workerThread.quit();
    workerThread.wait();
}

Qt是否在这里使用moveToThread(...)函数实现实际的移动语义? 即线程是否负责在完成后取消分配 Worker 对象,因为 Controller() 中分配的Worker*永远不会在任何地方显式删除?

moveToThread不会

转让所有权。

在链接的示例中,此行将确保在线程完成后删除工作线程:

connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);

似乎QThreadPool更适合您给出的示例。如文档中所述:

Worker *worker = new Worker();
// QThreadPool takes ownership and deletes 'worker' automatically
QThreadPool::globalInstance()->start(worker);

您的Worker类需要继承自QRunnable并实现 run() 虚函数。

Qt是否使用moveToThread(...)实现实际的移动语义 在这里起作用?即线程是否负责取消分配 工作器对象完成后,作为 Worker* 分配的 控制器()永远不会在任何地方明确删除?

moveToThread意味着myObject槽将在该 QThread 的事件循环的上下文中执行:

来自Qt文档:

默认情况下,run() 通过调用 exec() 启动事件循环并运行 线程内的 Qt 事件循环。

就所有权而言,在这种情况下,moveToThread与内存管理方面的所有权无关,而是与线程执行槽的所有权有关。默认情况下,所有插槽都在主Qt事件循环中执行。要将其移动到线程的线程,请调用moveToThread...