关于QT在主线程中处理绘画事件的问题

Snow_2018 2018-01-26 04:09:12
求助各位大佬:最近在写一个上位机用于接收下位机发来的二值化图像。刚开始是直接在主线程中绘制的,包括的数据的接收、处理、图像的绘制都是在主线程中,然后调试程序时发现CPU使用率高达95%,然后运行不到5分钟,linux系统直接死机(各种调试后发现是绘制事件导致的)。然后,新建了 一个线程,用于建立画布并在画布上绘画,然后在主线程的绘制事件中显示,但是这么做有强烈的闪烁,,,。无论使repaint还是update都不行,,,求助各位大佬,我该怎么做。。。是继续在子线程中绘画还是更改我的绘制事件。。。
...全文
835 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
besterector 2018-03-16
  • 打赏
  • 举报
回复
引用 楼主 xue745146527 的回复:
求助各位大佬:最近在写一个上位机用于接收下位机发来的二值化图像。刚开始是直接在主线程中绘制的,包括的数据的接收、处理、图像的绘制都是在主线程中,然后调试程序时发现CPU使用率高达95%,然后运行不到5分钟,linux系统直接死机(各种调试后发现是绘制事件导致的)。然后,新建了 一个线程,用于建立画布并在画布上绘画,然后在主线程的绘制事件中显示,但是这么做有强烈的闪烁,,,。无论使repaint还是update都不行,,,求助各位大佬,我该怎么做。。。是继续在子线程中绘画还是更改我的绘制事件。。。
1. 接收和处理不要放在主线程 2. 绘制也可以不写在主线程里。 可以先生成 qimage【注: 必须是 qimage】, 然后发送信号通知 主线程 repaint(image)
donwmufromdying 2018-01-29
  • 打赏
  • 举报
回复
个人觉得为什么不把画图部分放在主线程而子线程只负责数据交互呢?这样数据接收完成后发个信号给主线程.主线程取到数据后开始画图这样更合理
Little柯南 2018-01-28
  • 打赏
  • 举报
回复
线程中的数据通过信号与槽发出来,然后主线程接收显示!这个信号与槽你可以加锁,信号发出,槽执行才可以在接受信号
Snow_2018 2018-01-27
  • 打赏
  • 举报
回复
引用 1 楼 u010111033 的回复:
既然你用Qt,那么就该明白:所有绘图、显示、界面部分,必须放主线程!对于数据接收,串口也罢、网络tcp也好,你可以在线程操作,当接到一定的数据,然后从线程发信号出来,GUI主线程接收并绘制!你摆好这个架构,再谈CPU与内存!你cpu并不解码、也不做费时算法,能耗那么大,与你框架搭配有显著影响
问题大致已经解决了。首先感谢大佬的回答。。。后来依然是在线程中建立画布,然后主线程显示。出现闪烁的原因是run函数没有放到槽里面,放入之后就不闪烁了。。。但是我将所有的代码都放到主进程实现依然会使CPU使用率上升到95%多,不知道是为啥
Little柯南 2018-01-26
  • 打赏
  • 举报
回复
既然你用Qt,那么就该明白:所有绘图、显示、界面部分,必须放主线程!对于数据接收,串口也罢、网络tcp也好,你可以在线程操作,当接到一定的数据,然后从线程发信号出来,GUI主线程接收并绘制!你摆好这个架构,再谈CPU与内存!你cpu并不解码、也不做费时算法,能耗那么大,与你框架搭配有显著影响

16,211

社区成员

发帖
与我相关
我的任务
社区描述
Qt 是一个跨平台应用程序框架。通过使用 Qt,您可以一次性开发应用程序和用户界面,然后将其部署到多个桌面和嵌入式操作系统,而无需重复编写源代码。
社区管理员
  • Qt
  • 亭台六七座
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧