这是一个线程的基类,是moveToThread()实现多线程的。我做的几个项目都使用了这个基类目前没什么问题,可以拿来直接继承。
basethread.h
#ifndef BASETHREAD_H
#define BASETHREAD_H
#include <QObject>
#include <QThread>
#include <QDebug>
#include <qthread.h>
/*****************************************/
class BaseThread :public QObject
{
Q_OBJECT
public:
BaseThread();
void doStart();//开始线程
void doStop();//暂停线程
void doClose();//关闭线程
enum EnumStateThread
{
runing = 0,
stop = 1,
close = 2,
sleep = 3,
unknow = 4
};
protected:
Qt::HANDLE m_nThread_id;//线程号
EnumStateThread m_eState;//当前线程的状态
QThread * m_pThread;
virtual void work();
signals:
void ThreadEnd();//线程运行和主线程发送的信号
//void startThread();
private slots:
void workStart();
void closeThread();
};
#endif // BASETHREAD_H
basethread.cpp
#include "basethread.h"
#include <QCoreApplication>
#include <qthread.h>
BaseThread::BaseThread():
m_nThread_id(),
m_eState(unknow),
m_pThread(nullptr)
{
m_pThread = new QThread;
connect(this,&BaseThread::ThreadEnd,this,&BaseThread::closeThread);//关联线程结束信号
//connect(m_pThread, &QThread::finished, this, &QObject::deleteLater);
}
void BaseThread::doStart()
{
this->moveToThread(m_pThread);
connect(m_pThread,SIGNAL(started()),this,SLOT(workStart()));
m_eState = runing;
m_pThread->start();
}
void BaseThread::doStop()
{
m_eState = stop;
}
void BaseThread::doClose()
{
m_eState = close;
}
void BaseThread::work()
{
qDebug()<<m_nThread_id;
}
void BaseThread::workStart()
{
m_nThread_id = QThread::currentThreadId();
while(true)
{
if(m_eState == stop)
continue;
if(m_eState == close)
break;
work();
qApp->processEvents();//这里非常坑,一个项目用线程读写串口,但是内存不不断增大,一秒涨10k左右,后来查看大量博文才找到解决办法 就是加这句 为什么能解决问题……不清楚。
}
emit ThreadEnd();//发送线程结束信号
}
void BaseThread::closeThread()
{
m_pThread->quit();
m_pThread->exit();
}
新建一个类,继承BaseThread,重载work()函数,在这个函数中实现需要的功能。
class myThread:public BaseThread
{
Q_OBJECT
public:
myThread();
void work() override;//耗时工作写在这个函数中就行了
QString m_str;
};
执行doStart();这时候你的线程就运行起来了。
myThread *Thread = new myThread ();
Thread->doStart();