c++ - 在 Qt 中的线程之间发送对象作为信号参数

标签 c++ qt

我是 Qt 新手,正在尝试学习 Qt 线程机制。我处于这样一种情况,我希望后台线程执行一些长时间运行的任务,并在处理完每 100 个项目后将结果报告给另一个(或主)线程。现在我通过从后台线程发出一个信号来做到这一点,该信号包含在主线程的一个槽中接收到的已处理对象的列表。 Qt 是否在插槽中接收到信号参数时复制它?如果是这样,调用 qRegisterMetaType 有何帮助?这就是我要在我的代码中完成的任务:

//background thread
void run(){
   //get a query object from database
   int fireCount = 0;
   QList< QList<QVariant> > data;
   while(query->next()){
        fireCount++;
        QList<QVariant> row;
        //do some calculations on the fields read from the query
        processRow(query,&row);
        data.append(row);
        if(fireCount>100){
            emit publishDataToMainThread(data);
            fireCount = 0;
            data.clear();
        }
   }

}

//slot in main thread
void receiveData(QList< QList<Qvariant> > data){
\\display the data
}

此外,这是在线程之间传输对象的推荐做法吗?

最佳答案

这是一个非常好的方法。 QList 使用隐式共享(即写时复制),因此复制它意味着复制一个指针并增加引用计数。一旦您尝试修改它,它只会被复制。 请记住使用 Qt::QueuedConnection当将信号连接到槽时,槽会在接收器线程中运行。

qRegisterMetaTypeQ_DECLARE_METATYPE 是必需的,以便您可以在信号中按值传递参数。它告诉 Qt 元类型系统(有点像反射)这种类型存在。

关于c++ - 在 Qt 中的线程之间发送对象作为信号参数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12449624/

相关文章:

c++ - 非 IEEE 754 浮点类型的大小如何受到限制?

c++ - 使用 D_ptr 实现析构函数

c++ - C++ Qt 创建者项目中的编译错误

c++ - 我尝试在 linuxLite 上使用 qt creator 运行 qt-vtk-project

c++ - mpi MPI_Send() 适用于小数据集但不适用于大数据集

c++ - 存储函数调用和稍后调用的参数列表

c++ - 析构和删除

c++ - 如何返回复杂的返回值?

qt - QLabel:设置文本和背景的颜色

c++ - VTKActor 在渲染后不可见但在相机->resetview() 上可见