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會降低速度...所以測試一下,使用較低優先級或許就可以滿足您的要求了呢~~


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM