我是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
}
另外,这是在线程之间传输对象的推荐做法吗?
答案 0 :(得分:1)
这是一种非常好的方式。 QList使用隐式共享(即写入时复制),因此复制它意味着复制一个指针并增加引用计数。只有在您尝试修改它时才会复制它。 只需记住在将信号连接到插槽时使用Qt::QueuedConnection,以便插槽在接收器线程中运行。
需要 qRegisterMetaType
或Q_DECLARE_METATYPE
,以便您可以按信号中的值传递参数。它告诉Qt Metatype系统(有点像反射)这种类型存在。