16,212
社区成员
发帖
与我相关
我的任务
分享
嗯嗯,是挺麻烦的。或者应该更细致的去思考究竟是什么导致了界面的卡顿?通常情况下UI应该不会卡顿,只可能是短时间内有一个爆发性的占有提升,是否可能是因为一些不恰当的操作导致了一些关联操作?这些操作是否有必要,如果没有必要,可以想办法避免这些关联操作,如果有必要,再考虑是否可以延迟操作。代码是你写的,你肯定更清楚该怎么做。 [quote=引用 14 楼 Italink 的回复:]
[quote=引用 14 楼 Italink 的回复:]
屏幕大概有一半的区域是绘制实时波形的,40ms定时绘制打点走动。其余区域有些是热键,有些是定时更新的其他参数数值矩形widget块。点开热键会弹出各个菜单。热键都是qpushbutton实现的,菜单里面还有很多qt控件,combobox, spinbox啊,qlabel啊之类的。new一个空白大菜单,show出来,少说主线程就要几十毫秒,这个过程,假如主界面其他widget也要update,那么波形看起来更加是一顿一顿的。
如果你需要更高性能的绘图,可以学一下Qt封装的QOpenGLWidget,不过需要3D图形基础,短期内很难掌握
我看你之前的回答,你说A需要0.01ms,B可能100ms,所以主线程可能40ms完成不了绘制导致卡顿,是因为你把大多事情都交给主线程了(比方说一些绘图的设置操作) 你需要做的是,主线程40ms定时刷新,每一次刷新都去绘制两张pixmap,不管这个pixmap里是什么。然后呢要做的就是在一个线程中以0.01ms去处理A对应的pixmap,以另一个线程以100ms来处理B对应的pixmap,这样就能保证主线程同步也不会出现卡顿
你应该是用的qPainter吧,你可以在子线程中使用QPainter对同一张QPixmap进行绘图,主线程去绘制这张qPixmap,需要注意的就是你显示这张pixmap的时机以及何时去清空这张pixmap,如果你不需要持续的实时绘制,你完全可以在主线程同时绘制这两个图形的pixmap,只不过如果某个pixmap如果没有绘制完成,你只需要给这张pixmap填充透明色,子线程绘图(或者重置)完毕,只需要发送一个信号,在主线程刷新一下界面即可
看一下QCoreApplication::processEvents()有没有用