• 问题描述:

    一般将计算量大的处理过程单独放置到一个单独的线程处理,因此很有可能你的处理过程需要while(1)或类似的操作。

  也因此很有可能造成线程在处理时计算机CPU占用过高的情况。

  • 解决办法:

    • 降低相应线程优先级
    • sleep
  • 具体实现:

    1.创建工作线程

 #include <QThread>
 #include <QDebug>
 #include <QMutex>
 #include <QMutexLocker>

 #include <unistd.h>

 class WorkThread : public QThread
 {
     Q_OBJECT
 public:
     ):
         QThread(parent)
       ,m_bStop(false)
       ,m_iTest()
     {}

     ~WorkThread()
     {
         wait();
     }

     void stop()
     {
         QMutexLocker Locker(&m_mutexLock);
         m_bStop = true;
     }

 protected:
     void run()
     {
         do{
             m_iTest++;
             emit sigFind(QString::number(m_iTest));
             sleep();//::sleep(10);
         }while(!m_bStop);
     }

 signals:
     void sigFind(const QString &);

 private:
     bool m_bStop;
     int m_iTest;
     QMutex m_mutexLock;
 };

    2.创建工作对象

 #include <QObject>
 #include <QDateTime>
 #include <QTimerEvent>
 #include <QCoreApplication>

 #include "workthread.hpp"

 class WorkObject : public QObject
 {
     Q_OBJECT

 private:
     int m_iTimerId_PrintTime;
     WorkThread *m_threadWork;

 public:
     ):
         QObject(parent)
       ,m_iTimerId_PrintTime(-)
       ,m_threadWork()
     {
         //Timer
         m_iTimerId_PrintTime = startTimer();//print current time: yyyy-MM-dd hh:mm:ss

         // WorkThread
         m_threadWork = new WorkThread(this);
         connect(m_threadWork,SIGNAL(sigFind(QString)),this,SLOT(slotFind(QString)));
         connect(m_threadWork,SIGNAL(finished()),m_threadWork,SLOT(deleteLater()));

         m_threadWork->start();
     }

     ~WorkObject()
     {
         if(m_threadWork)
             m_threadWork->stop();
     }

 protected:
     void timerEvent(QTimerEvent *event)
     {
         if(event->timerId() == m_iTimerId_PrintTime)
         {
             qDebug()<<QDateTime::currentDateTime().toString("yyyy-MM-dd hh:mm:ss");
         }
     }

 private slots:
     void slotFind(const QString &s)
     {
         qDebug()<<"Find:"<<s;
     }
 };

    3.main.cpp

 #include <QTimer>
 #include <QtCore/QCoreApplication>

 #include "workobject.hpp"

 int main(int argc, char *argv[])
 {
     QCoreApplication a(argc, argv);
     WorkObject worker;

     QTimer::singleShot(, &a, SLOT(quit()));
     return a.exec();
 }

    4.执行结果

  

  • 最后:你懂滴,sleep会降低速度...所以测试一下,使用较低优先级或许就可以满足您的要求了呢~~

Qt线程(4) 降低线程占用CPU的更多相关文章

  1. Linux中找到占用cpu最高的线程

    在工作中,经常会碰到CPU占用100%的情况,那如何找到是那个线程占用了cpu呢? 1. top命令,找到cpu占用最高的进程 2. 查看该进程的线程, top  -p <pid> 3. ...

  2. CPU线程 和 Java线程

    一 cpu个数.核数.线程数的关系 cpu个数:是指物理上,也及硬件上的核心数: 核数:是逻辑上的,简单理解为逻辑上模拟出的核心数:一个CPU核心数模拟出2线程的CPU 线程数:是同一时刻设备能并行执 ...

  3. 线程回调,线程中的队列,事件,greenlet模块,gevent模块,自定义补丁, 单线程实现并发,协程

    1.线程回调 在线程池/进程池每次提交任务,都会返回一个表示任务的对象,Future对象Future对象具备一个绑定方法,add_done_callback 用于指定回调函数 add 意味着可以添加多 ...

  4. Linux排查Java程序占用CPU很高的解决办法

    Java的工具集相当强大,学习成本也很低,处理线上问题时,jstack这个工具就比微软的windbg,好学好用很多,3步找出占用CPU很高的源所在.而windbg反人类的各种命令,实在不敢恭维. 故意 ...

  5. 线上Java程序占用 CPU 过高,请说一下排查方法?

    我是风筝,公众号「古时的风筝」,一个兼具深度与广度的程序员鼓励师,一个本打算写诗却写起了代码的田园码农! 文章会收录在 JavaNewBee 中,更有 Java 后端知识图谱,从小白到大牛要走的路都在 ...

  6. 服务器CPU又爆了?Linux快速排查Java程序占用CPU很高的方法

    这个问题可以说是 Java 面试的高频面试题了,有很多面试官都喜欢问这个问题,问题可能是下面这样的. 线上一台服务器 CPU 使用率100% 了,如果你碰到这样的情况,如何排查并找到问题原因? 1.场 ...

  7. 再记一次w3wp占用CPU过高的解决过程(Dictionary和线程安全)

    在此之前项目有发生过两次类似的状况,都得以解决,但最近又会发现偶尔CPU会跑满,虽然之前使用过WinDbg解决过两次问题但人的记忆是不可靠的,今天处理同样问题的时候还是遇到了一些障碍,这一次希望可以记 ...

  8. 记一次w3wp占用CPU过高的解决过程(Dictionary和线程安全)

    项目上线以来一直存在一个比较揪心的问题,和一个没有信心处理的BUG,那就是在应用程序启动时有可能会导致cpu跑满99%或持续在一个值如50%左右,这样一来对服务器的压力是非常大的,经常出现服务器无法远 ...

  9. windows下揪出java程序占用cpu很高的线程 并找到问题代码 死循环线程代码

    我的一个java程序偶尔会出现cpu占用很高的情况 一直不知道什么原因 今天终于抽时间解决了 系统是win2003 jvisualvm 和 jconsole貌似都只能看到总共占用的cpu 看不到每个线 ...

随机推荐

  1. [CentOS7服务器] 更改系统时间

    未知何故,服务器上的系统时间不对,比实际的UTC快了将近63分钟.在涉及本地文件与远程服务器文件的时间戳校验时,容易产生混淆. 这里把系统时间更正的过程记录如下. 参考资料:http://www.ce ...

  2. CentOS 6中MATLAB print函数“所见非所得”bug的解决方案

    0 系统配置+软件版本 主机:Dell optiplex 390 MT (i5) 系统+软件:CentOS 6.5 x64, Matlab R2012, R2013 系统+软件:CentOS 6.7 ...

  3. Practical Malware Analysis里有关inetsim\APATEDNS

    以前从未接触过linux,碰到了许多问题,按步骤: 1\安装VMWARE,安装ubuntu16.04 问题1:之前装的是VM10,装完后没有安装VMTOOLS,我点安装 VMTOOLS,它弹出“简易安 ...

  4. IOS Core Animation Advanced Techniques的学习笔记(五)

    第六章:Specialized Layers   类别 用途 CAEmitterLayer 用于实现基于Core Animation粒子发射系统.发射器层对象控制粒子的生成和起源 CAGradient ...

  5. 1472. Martian Army

    http://acm.timus.ru/problem.aspx?space=1&num=1472 题目大意: 一颗树,根节点(1) 的值为 1.0,所有叶子节点的值为 0.0 ,其他节点值任 ...

  6. 在VMware中安装ubuntu出现菜单栏无法显示的情况

    在VMware中安装ubuntu出现菜单栏无法显示的情况 其实这个问题的原因时由于VMware中enable了3D图形加速界面,只需要shutdown当前运行的虚拟机,然后在虚拟机,设置,显示器,3D ...

  7. vector algorithm find

    本来想着申请了博客园以后 我要写的博客都必须是有深度有内涵的...好吧 结果我只能说我想多了 还是得一步一步慢慢来 最近小学期的任务是要做一个学校食堂餐卡管理系统     有“严重拖延症”的我  果然 ...

  8. java 通过反射获取调用类方法及属性

    首先说下反射是什么?反射是Sun公司推出的一组API,此组API位于Java.lang.reflect中 反射的作用是编写工具(例如eclipse),编写框架,当然对于一般的程序,我们不可能用反射来做 ...

  9. C++小项目:directx11图形程序(一):主框架

    最近在学习DIRECTX11,在学习过程中编写了一个程序,到现在发现这个程序也有几行代码了,结构还算整齐,就想把这个程序分享出来,其中涉及到了C++程序的架构,windows窗口程序编写,和Direc ...

  10. php的__clone __call

    (1) __clone方法在一个对象赋值给另外的一个对象的时候自动调用 <?php class A { public $a = "aa"; public $b = 10; f ...