QThread 将结果数据传递给主线程
QThread pass result data to MainThread
我正在考虑如何在不复制的情况下将结果数据从某个工作线程传递回客户端。Worker 存在于其他线程中,BigData 继承了 QObject。我的想法是改变数据的所有权:
class Worker: public QObject
{
Q_OBJECT
public:
explicit Worker(QObject *parent = 0): QObject(parent);
signals:
void resultReady(BigData *data);
public slots:
void doWork() {
BigData *data = new BigData(this); // alloc new Data
while (!dataReady) {
... // appending data
}
// Data ready
// clearing ownership
data->setParent(NULL); // data can't be moved to another thread with parent
data->moveToThread(NULL);
emit resultReady(data);
}
};
void MainWindow::handleResult(BigData *data)
{
if (currentData_) {
delete currentData_;
}
data->setParent(this); // set new ownership
// works only if data's thread is NULL
data->moveToThread(QApplication::instance()->thread());
currentData_ = data;
}
好看吗?还是有更合适的方法?
通常使用moveToThread()
将对象从一个线程推送到另一个线程。这意味着,您可以编写data->moveToThread(QApplication::instance()->thread());
以避免将线程关联设置为NULL
然后从主线程更改它,而不是在doWork()
插槽中执行data->moveToThread(NULL);
。但是,将BigData
实例移动到主线程后,请注意从工作线程触摸该QObject
。另一件需要注意的事情是,在线程之间来回移动QObject
可能会导致一些副作用,来自文档:
请注意,对象的所有活动计时器都将重置。计时器首先在当前线程中停止,然后在目标线程中重新启动(以相同的间隔)。因此,在线程之间不断移动对象可能会无限期地推迟计时器事件。
仅仅为了内存管理而QObject
是矫枉过正的。QObject
提供了更多你在这里并不真正需要的东西(内省功能、动态属性、信号/插槽、线程亲和力、事件处理、国际化......)。
如果您只对内存管理感兴趣,Qt和C++标准库具有智能指针,可以通过唯一所有权或共享所有权语义实现对象生命周期管理。
查看此答案,了解将数据加载卸载到全局线程池并在准备好后立即在视图中显示这些数据的模型示例。请注意,模型继承了QObject
(因为QAbstractItemModel
继承了QObject
,因为它使用信号/槽来通知数据更改的视图),但实际保存数据的数据结构没有理由继承QObject
。
- QtConcurrent - 在发布到 UI 线程的数千个结果中保持 GUI 响应
- C++ 多线程给出不同的结果
- C++ 线程端回调并返回结果
- 在向量上声明缩减,在 1 个线程上运行给出的结果与没有 openmp 的结果不同
- 错误 C2064:term 的计算结果不是采用 1 个参数的函数 - 关于线程的一些东西
- 提升线程:术语的计算结果不为 0 个参数
- 如何在C++中获取线程的结果
- 多线程合并选项的奇怪结果
- 多线程文件读取为每个线程生成相同的结果
- 在多线程工作负载上解释Gperftools的结果
- 从多个线程收集结果的缓存友好方式
- 将线程的结果转储到向量中是线程安全的吗
- 从 IOCP 线程调用 WSAGetLastError() 将返回不正确的结果
- 与单线程相比,c++/java的多线程性能结果参差不齐
- 如何从线程的结果返回Qt对象(Qtfutur)
- CUDA 线程在全局内存中的私有位置写入时出现错误结果
- 我的线程工作不好,它给出了所有结果,最后没有一个接一个,GUI 在线程运行期间挂起?
- 从非线程阻塞消息框获取结果
- 线程合并排序给出无效结果
- C++ 将结果从多个线程返回到数组中