1

我是 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
}

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

4

1 回答 1

1

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

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

于 2012-09-17T07:21:22.150 回答