1

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 对象,因为Worker*分配的对象Controller()永远不会在任何地方显式删除?

4

3 回答 3

5

moveToThread不会转让所有权。

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

connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
于 2017-10-24T15:23:07.970 回答
1

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

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

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

于 2017-10-24T15:49:10.070 回答
0

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

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

来自Qt 文档

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

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

于 2017-10-24T15:20:25.680 回答