在QObject :: moveToThread中移动语义

时间:2017-10-24 15:03:11

标签: c++ qt qthread ownership-semantics

QThread class的文档中,一个示例性设置如下:

moveToThread(...)

Qt是否在这里使用Worker*函数实现实际的移动语义?即完成后,线程是否负责取消分配Worker对象,因为Controller()中分配的interface Config { API_URI: string, } const config: Config = { API_URI: 'localhost:3010', } export default config 永远不会在任何地方明确删除?

3 个答案:

答案 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的事件循环的上下文中执行:

来自Qt documentation

  

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

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