【QT学习】多线程开发中线程间的数据传输问题

本文讲述了在Qt软件开发中遇到的子线程串口操作卡顿问题,原因在于尝试在子线程中更新主线程的UI。作者通过查找资料发现Qt禁止跨线程UI操作,解决方案是使用信号槽机制进行线程间数据通信,从而解决了问题。
摘要由CSDN通过智能技术生成

一、遇到问题

今天在对软件进行测试开发时,为了解决软件在运行视频显示和串口接发过程中的卡顿问题,创建了两个子线程来运行两个功能。

在使用moveToThread()函数将串口功能添加进新线程并编译运行时,出现了如下图所示的问题:

这个问题的意思是在connect时无法对“QTextCursor”类型的参数进行排队,除此之外并没有其他的错误提示信息,也没有打印具体的错误位置。

二、查找原因

从该语句中我并未发现任何问题,于是便查找网上相关问题的资料,得知该问题出现大概率是因为在子线程中调用了主线程中窗口类的控件函数,于是又回去查看了一下connect语句中的槽函数serialRecv(),发现确实在这个函数中调用了主窗口控件QTextBrowser::append()。

查看了网上一些博主给出的解释,大概意思就是QT不能在子线程中对主窗口进行界面更新的操作。在多线程并发运行过程中,如果不同线程同时更新UI的话会导致程序出现错误,这是不安全的,于是程序便会异常退出,所以最好就是只在一个线程中进行UI界面更新,也就是窗口的主线程。

三、解决方案

基于上述原因,解决该问题的方法就是不在子线程中调用UI控件,转而通过QT的信号槽来实现不同进程间的数据传输,也就是通过自定义信号和槽函数,再用connect在线程间建立连接。

建立完之后,再次编译运行,串口能够正常进行数据接发,同时视频不会出现卡顿现象。

  • 5
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值