分析思路
总的来说,Qt程序CPU占用率较高的原因可能有以下几点:
1、在paintEvent中调用update函数,造成无限循环
2、频繁刷新数据
3、复杂的浮点运算
4、死循环
5、paintEvent里操作太多
我遇到这个问题的程序是利用多个子线程(接收子线程)同时接收并解析网口的数据,同时另外一个子线程(融合子线程)对多个子线程解析得到的数据进行融合处理,接收子线程和融合子线程之间通过Qt的信号-槽机制进行数据交互。
通过分析发现,各子线程运行之后均处于死循环状态,即使此时没有待接收/处理的数据,线程也会处于“空转”状态,由此导致了CPU的过分占用。
解决办法
对于上述情况导致的CPU占用率过高问题,可以根据子线程数量以及子线程循环中需要实时处理的数据量的多少来给子线程添加合适的休眠时间。
具体来说,可以使用QThread类中的sleep(或msleep、usleep)成员函数将线程暂时挂起一段时间,指定时间一过,线程将自动唤醒。
当运行中的子线程数量较少时,一般只要在子线程死循环的末尾使用sleep(0);即可,这样理论上虽然不会是线程挂起任何时间,但是该调用会使线程自动放弃当前的时间片,使时间片可以被系统分配给另外的线程,这样就可以有效减少线程占用的CPU资源。
但是若程序中同时运行的子线程较多,使用sleep(0);可能仍然无法降低程序CPU的占用率,这时可以根据子线程循环中需要实时处理的数据量来指定合适的线程挂起时间。
由于我的程序中用到的子线程数量较多,经过测试,使用sleep(0);无法取得明显的效果,最终指定每个子线程在循环的末尾挂起15ms,即:
1 while(true)
2 {
3 ...
4 msleep(15);
5 }