QObject::moveToThread中的移动语义
Move semantics in QObject::moveToThread
在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
...
相关文章:
- 何时在引用或唯一指针上使用移动语义
- 如何从具有移动语义的类对象中生成共享指针
- 可以使用移动语义更改或改进此C++代码吗?
- c++在使用指针时移动语义
- 移动语义和深层/浅层复制之间有什么关系?
- std::unique_lock移动语义
- 移动语义和运算符 + 重载
- C++ 移动语义是否在任何情况下都能节省资源?
- 移动语义在这里如何工作?
- 使用移动语义:右值引用作为方法参数
- 在C++中使用移动语义的正确方法是什么?
- 移动语义 c++ 单链表
- C++:使用整数移动语义
- 当变量和参数名称匹配时,移动语义构造失败
- 在 C++11 中移动语义
- 方法冗余移动调用的移动语义
- 复制省略并在返回值中移动语义
- std::元组和移动语义
- 移动语义与返回shared_ptr?
- C++具有移动语义的可变参数工厂会导致运行时崩溃