在Qt中的线程之间发送对象作为信号参数
Sending objects as signal arguments between threads in 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,以便插槽在接收器线程中运行。
需要qRegisterMetaType
或Q_DECLARE_METATYPE
,以便可以按信号中的值传递参数。它告诉Qt元类型系统(有点像反射)这种类型存在。
相关文章:
- 如何在qt中将信号和插槽与另一个对象连接 --解决了
- QObject::连接无法将信号连接到*this*对象的插槽
- 通过插槽和信号在不同线程中的两个qt对象之间进行通信
- Qt:如何通知对象已建立涉及它的信号槽连接
- 使用信号和插槽连接多个 UI 对象
- 为什么信号连接会使套接字客户端对象失效?
- 可以在 QObject::connect() C++中连接 QML 对象现有信号?
- 使用 enum 参数将 C++ 对象信号连接到 QML 信号处理程序
- 销毁 qml 对象后的信号槽连接
- 不同类别的 2 个对象之间的信号/插槽
- 两个对象QT之间的示例插槽/信号
- 与不同父母的班级中的对象之间发送信号
- 如何在Qt中向QThread类的特定对象发出信号
- 通过信号从QML接收QChart或QChartView对象
- PyQt5:使用自定义信号时 int 对象的错误转换
- 有没有一种方法可以将升压信号和插槽与不可复制的对象一起使用
- Qt 通过将对象移动到线程来跨线程发出信号
- 升压信号参考对象超出范围?
- 将所有对象信号连接到单个插槽
- 级联导航窗格:连接到另一个qml文件的对象信号