qt 串口通信 上位机 qcustomplot绘图 绘制8万点后程序假死

ㄨ柒ツギ怨 2020-10-21 03:46:54
使用qt 写了个上位机,下位机每1ms发送数据,子线程串口有数据就发送信号给GUI线程,GUI绘图,但是绘制8万个点后,程序就假死了,如果下位机每10ms发送数据,程序就不会假死,有没有大佬帮忙解决下。谢谢了
...全文
22528 10 打赏 收藏 转发到动态 举报
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
再一次丶誓言 2021-02-25
  • 打赏
  • 举报
回复 1
请问楼主最后是如何解决问题的呀
再一次丶誓言 2021-02-25
  • 打赏
  • 举报
回复 1
楼主,我也遇到类似的问题。在使用上位机绘制频响曲线图时,我是4ms绘制一次曲线图,绘图的部分没有出现卡顿,但是整个软件都不可以操作了,想请教一下您是用什么方法进行进行的绘图,或者如何避免整个软件卡死的情况。
Lenged_Zhao 2020-10-23
  • 打赏
  • 举报
回复 1
引用 6 楼 ㄨ柒ツギ怨 的回复:
[quote=引用 5 楼 Lenged_Zhao 的回复:][quote=引用 3 楼 ㄨ柒ツギ怨 的回复:][quote=引用 1 楼 Lenged_Zhao 的回复:]堆栈溢出了吧,1ms发送数据,GUI线程来不及收或者来不及处理,造成缓存区溢出或者堆栈溢出?
10ms发送数据,接收可以达20多万,使用的是customPlot->graph(0)->addData()。怎么查看是否是溢出啊[/quote] 这涉及一些线程的调用,要知道多情况线程并不是真正的并行,而是分成一个个很小的时间片段,每个线程根据优先级进行轮着来执行。所以你那种情况可能是,你的发送线程以1ms发送一次数据后,GUI线程在这1ms的时间中还没有轮到它执行或者1ms的时间它执行不完,然后CPU就切出去执行其他线程了,然后下次来的数据就被堆积了,次数多了就溢出。而10ms的间隔发送数据,会让GUI线程有很大可能执行完一次数据处理。[/quote] 有什么办法可以调优或者监控是否溢出呀[/quote] 我没有使用QT进行过开发,我根据做嵌入式时候的经验说一下: 1、调整线程优先级,将GUI线程优先级调高,能缓解一些,并设计线程锁,保障GUI线程能执行完。 2、调整数据发送逻辑,设计一个循环存储区(可能会照成一些数据的丢失),或者使用邮箱、信号量进行数据传输,发送开始前检测邮箱是否已满,负责等待。 3、在发送数据的线程中直接调用GUI程序,省掉线程调用。
ziqi0716 2020-10-23
  • 打赏
  • 举报
回复 1
建议: 数据采集,存储,可视化,分开做. 采集的数据一般先放缓存,然后持久化到文件或者数据库 数据可视化也要考虑数据量问题,如果数据量不大,通常全量显示就行,但如果数量过大要做"数据抽样".(大量数据抽样显示趋势及极值点,可以放大显示具体数据详情,如地图常用的金字塔切片原理,全局看缩略图,放大显示详细信息). 至于你说的"业务需求,要求实时性",我觉得这个是伪需求,为什么这么说呢?试想下,你用特别牛逼的计算机毫秒级捕捉并显示了一个曲线的高点,然后呢?让用户去点击某个按钮吗?假如你慢了100ms,对用户来说感觉不出来的,有什么影响呢?
ㄨ柒ツギ怨 2020-10-22
  • 打赏
  • 举报
回复 1
引用 5 楼 Lenged_Zhao 的回复:
[quote=引用 3 楼 ㄨ柒ツギ怨 的回复:][quote=引用 1 楼 Lenged_Zhao 的回复:]堆栈溢出了吧,1ms发送数据,GUI线程来不及收或者来不及处理,造成缓存区溢出或者堆栈溢出?


10ms发送数据,接收可以达20多万,使用的是customPlot->graph(0)->addData()。怎么查看是否是溢出啊[/quote]

这涉及一些线程的调用,要知道多情况线程并不是真正的并行,而是分成一个个很小的时间片段,每个线程根据优先级进行轮着来执行。所以你那种情况可能是,你的发送线程以1ms发送一次数据后,GUI线程在这1ms的时间中还没有轮到它执行或者1ms的时间它执行不完,然后CPU就切出去执行其他线程了,然后下次来的数据就被堆积了,次数多了就溢出。而10ms的间隔发送数据,会让GUI线程有很大可能执行完一次数据处理。[/quote]

有什么办法可以调优或者监控是否溢出呀
Lenged_Zhao 2020-10-22
  • 打赏
  • 举报
回复
引用 3 楼 ㄨ柒ツギ怨 的回复:
[quote=引用 1 楼 Lenged_Zhao 的回复:]堆栈溢出了吧,1ms发送数据,GUI线程来不及收或者来不及处理,造成缓存区溢出或者堆栈溢出?
10ms发送数据,接收可以达20多万,使用的是customPlot->graph(0)->addData()。怎么查看是否是溢出啊[/quote] 这涉及一些线程的调用,要知道多情况线程并不是真正的并行,而是分成一个个很小的时间片段,每个线程根据优先级进行轮着来执行。所以你那种情况可能是,你的发送线程以1ms发送一次数据后,GUI线程在这1ms的时间中还没有轮到它执行或者1ms的时间它执行不完,然后CPU就切出去执行其他线程了,然后下次来的数据就被堆积了,次数多了就溢出。而10ms的间隔发送数据,会让GUI线程有很大可能执行完一次数据处理。
ㄨ柒ツギ怨 2020-10-21
  • 打赏
  • 举报
回复
引用 2 楼 worldy 的回复:
1mS和10mS发送数据的差别意义是什么?非要1mS不可?


业务需求,要求实时性
ㄨ柒ツギ怨 2020-10-21
  • 打赏
  • 举报
回复
引用 1 楼 Lenged_Zhao 的回复:
堆栈溢出了吧,1ms发送数据,GUI线程来不及收或者来不及处理,造成缓存区溢出或者堆栈溢出?


10ms发送数据,接收可以达20多万,使用的是customPlot->graph(0)->addData()。怎么查看是否是溢出啊
worldy 2020-10-21
  • 打赏
  • 举报
回复 1
1mS和10mS发送数据的差别意义是什么?非要1mS不可?
Lenged_Zhao 2020-10-21
  • 打赏
  • 举报
回复
堆栈溢出了吧,1ms发送数据,GUI线程来不及收或者来不及处理,造成缓存区溢出或者堆栈溢出?

27,373

社区成员

发帖
与我相关
我的任务
社区描述
硬件/嵌入开发 单片机/工控
社区管理员
  • 单片机/工控社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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