QCoreApplication::processEvents好用但不能瞎用
1、为了解决界面卡死的问题,大量使用
2、主线程下定时器中或者执行长时间任务的循环体中,增加之后,界面流畅很多;
无意识的滥用
没有了解QCoreApplication::processEvents本质功能和作用,在子线程中使用,没感觉有异常;
后来大量使用,发现程序很不稳定,期初怀疑读写串口不稳定,设备驱动不稳定等等
通过AI查阅资料之后,发现子线程函数中不能使用,各种异常无法分析和定位;
有一次断点调试的时候,原本应该执行的代码,突然不执行了,才真正的意识到,问题的严重性,删除就好了,原来卡顿的问题根源不是没有调用这个方法,而是程序处理有问题;
其中定时任务和消息堆叠的问题,豆包会给很经典的方法解决,当任务没有完成时候,多余的消息就会丢弃,防止消息堆叠,出现问题;
其中全自动卡卡仪,步进电机都在子线程中完成调用设备的控制,在等待的循环中,大量使用,出现了信号不稳,读写错误,甚至失败很高,经过删除之后,读取的数据失败很少了,测试也稳定了很多。
5、硬性整改规则(工控设备必遵守)
- 所有 moveToThread 后的子线程定时函数,删除任意形式 QCoreApplication::processEvents,不管加什么过滤参数;
- 锁临界区内严禁任何 processEvents,主线程子线程都不行;
- EtherCAT/SOEM 运动控制循环内,不能手动刷新事件,依赖线程 exec 保证周期稳定;
- UI 界面刷新全部通过
emit信号抛给主线程,子线程只做硬件读写。
