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

C++ 在Qt中的线程之间发送对象作为信号参数,c++,qt,C++,Qt,我对Qt是新手,正在尝试学习Qt线程机制。我希望后台线程执行一些长时间运行的任务,并在处理每100个项目后将结果报告给另一个(或主)线程。现在,我通过从后台线程发出一个信号来实现这一点,该信号包含在主线程的插槽中接收的已处理对象的列表。当在插槽中接收到信号参数时,Qt是否复制该参数?如果是这样,调用qRegisterMetaType有什么帮助?这就是我在代码中要实现的目标: //background thread void run(){ //get a query object from

我对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
}
//后台线程
无效运行(){
//从数据库中获取查询对象
int firecont=0;
QList数据;
while(查询->下一步()){
fireCount++;
QList行;
//对从查询中读取的字段执行一些计算
processRow(查询和行);
数据。追加(行);
如果(fireCount>100){
将publishDataToMainThread(数据)发出;
火种数=0;
data.clear();
}
}
}
//主线程中的插槽
无效接收数据(QListdata){
\\显示数据
}

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

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


需要
qRegisterMetaType
Q\u DECLARE\u METATYPE
,以便您可以通过信号中的值传递参数。它告诉Qt元类型系统(有点像反射)这种类型存在。

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


需要
qRegisterMetaType
Q\u DECLARE\u METATYPE
,以便您可以通过信号中的值传递参数。它告诉Qt元类型系统(有点像反射)这种类型存在。

也可能使用
data=QList()
而不是
数据。clear()
可能会保存不必要的副本。但这可能是不必要的,我没有查看
clear()
的源代码,只有一种可靠的方法可以保存不必要的副本,那就是C++11移动语义。但考虑到Qt仍然不支持C++98模板,这可能有点乐观。不过,总的来说,
.clear()
在短期内效率更高。忽略我之前的评论,
clear()
在互联网上只调用
*this=QList()
。也可能使用
data=QList
而不是
数据。clear()
可能会保存不必要的副本。但这可能是不必要的,我没有查看
clear()
的源代码,只有一种可靠的方法可以保存不必要的副本,那就是C++11移动语义。但考虑到Qt仍然不支持C++98模板,这可能有点乐观。尽管如此,总的来说,
.clear()
在短期内效率更高。忽略我之前的评论,
clear()
在互联网上只调用
*this=QList()