使用QThread实现多线程

这是一个线程的基类,是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();
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值