在QThread class的文档中,一个示例性设置如下:
moveToThread(...)
Qt是否在这里使用Worker*
函数实现实际的移动语义?即完成后,线程是否负责取消分配Worker对象,因为Controller()
中分配的interface Config {
API_URI: string,
}
const config: Config = {
API_URI: 'localhost:3010',
}
export default config
永远不会在任何地方明确删除?
答案 0 :(得分:2)
moveToThread
不会转让所有权。
在链接的示例中,此行将确保在完成线程后删除worker:
connect(&workerThread, &QThread::finished, worker, &QObject::deleteLater);
答案 1 :(得分:1)
QThreadPool
似乎更适合您提供的示例。正如文档中所解释的那样:
pos = data - min(data, [], 2);
normalized = pos ./ sum(pos, 2);
您的Worker *worker = new Worker();
// QThreadPool takes ownership and deletes 'worker' automatically
QThreadPool::globalInstance()->start(worker);
类需要从QRunnable
继承并实现run()虚函数。
答案 2 :(得分:0)
Qt是否使用moveToThread(...)实现实际的移动语义 功能在这?即线程是否负责取消分配 Worker对象一旦完成,就像Worker *分配的那样 Controller()永远不会在任何地方明确删除?
moveToThread
意味着myObject
的广告位将在QThread的事件循环的上下文中执行:
默认情况下,run()通过调用exec()并运行a来启动事件循环 线程内的Qt事件循环。
就所有权而言,在此上下文中,moveToThread与内存管理方面的所有权无关,而是与线程执行槽的所有权无关。默认情况下,所有插槽都在主Qt事件循环中执行。要将其移至线程的那个,请调用moveToThread
...