在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
...