问题描述
一般将计算量大的处理过程单独放置到一个单独的线程处理,因此很有可能你的处理过程需要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会降低速度...所以测试一下,使用较低优先级或许就可以满足您的要求了呢~~
