Qt线程--降低线程占用CPU
问题描述
一般将计算量大的处理过程单独放置到一个单独的线程处理,因此很有可能你的处理过程需要while(1)或类似的操作。也因此很有可能造成线程在处理时计算机CPU占用过高的情况。
解决办法
- 降低相应线程优先级
- sleep
具体实现
1.创建工作线程
#include <QThread> #include <QDebug> #include <QMutex> #include <QMutexLocker> #include <unistd.h> class WorkThread : public QThread { Q_OBJECT public: explicit WorkThread(QObject *parent = 0): QThread(parent) ,m_bStop(false) ,m_iTest(0) {} ~WorkThread() { wait(); } void stop() { QMutexLocker Locker(&m_mutexLock); m_bStop = true; } protected: void run() { do{ m_iTest++; emit sigFind(QString::number(m_iTest)); sleep(10);//::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: explicit WorkObject(QObject *parent = 0): QObject(parent) ,m_iTimerId_PrintTime(-1) ,m_threadWork(0) { //Timer m_iTimerId_PrintTime = startTimer(1000);//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(10000, &a, SLOT(quit())); return a.exec(); }
4.执行结果
最后
sleep会降低速度...所以测试一下,使用较低优先级或许就可以满足您的要求了呢~~
祝:玩得愉快!