Qt实现多线程的两种方式

Qt线程

Qt4.7之前版本处理步骤

  1. 自定义一个类,继承于QThread。

    class MyThread:public QThread{
    public:
        vid run();	//虚函数  线程处理函数(和主线程不在同一个线程)
        
    signals:
        void isDone();	//信号 线程执行完发送
    }
    void MyThread::run() {
        // 实现  -- 复杂的处理过程
        
        emit isDome;	// 发送线程
    };
    
  2. 定义线程

    MyThread thread;
    
  3. 开启线程

    thread.start();
    

    不能通过直接调用run()函数,通过start()函数间接调用run()函数。

  4. 自定义线程结束槽函数

    public:
    	void dealDone();
    ——————————————————————
    void Widget::dealDone(){
        // 线程结束后的操作
    }
    
  5. 绑定线程结束信号和线程结束槽

     connect(&thread,&MyThread::isDone,this,&Widget::dealDone);
    
  6. 定义线程关闭槽函数

    void Widget::stopThread(){
        // 停止线程
        thread->quit();
        // 等待线程运行完成之后结束
        thread->wait();
    }
    

    建议不要使用terminate()容易出现内存问题

    建议使用quit()

  7. 绑定窗口关闭信号和线程关闭槽函数

    connect(this,&Widget::destroyed,this,&Widget::stopThread);
    

新用法处理步骤

  1. 设定一个类,继承于QObject。

  2. 类中设置一个线程函数(只有一个函数是线程函数)和线程开始信号。

    class MyThread : public QObject
    {
        Q_OBJECT
    public:
        explicit MyThread(QObject *parent = nullptr);
    
        void run();
        void start();
        void stop();
    
    signals:
        void myThreadrun();
    
    private:
        bool isrun;
    public slots:
    };
    void MyThread::run(){
        while(isrun == true) {
            QThread::sleep(1);
            emit myThreadrun();
            qDebug() << "子线程:" << QThread::currentThread();
            if(isrun == false) break;
        }
    }
    void MyThread::start() {
        qDebug() << "开始";
        this->isrun = true;
    }
    
    void MyThread::stop(){
        qDebug() << "停止";
        this->isrun = false;
    }
    
  3. 创建线程对象(不能指定对象)和 QThread子线程对象

    MyThread *mythread;
    QThread *thread;
    -------------------------------------------------------------------------------------------
    this->mythread = new MyThread;
    this->thread = new QThread(this);
    
  4. 处理事件、鼠标按下开启和关闭事件、窗口关闭事件处理

    void Widget::dealThread() {
        static int i = 0;
        i++;
        ui->lcdNumber->display(i);
    }
    void Widget::on_pushButton_strat_clicked()
    {
        if(thread->isRunning() == true){
            return;
        }
        thread->start();
        mythread->start();
        emit runThread();
    
    }
    void Widget::on_pushButton_stop_clicked()
    {
        if(thread->isRunning() == false){
            return;
        }
        mythread->stop();
        thread->quit();
        thread->wait();
    }
    void Widget::dealThreadclose() {
        on_pushButton_stop_clicked();
        delete mythread;
    }
    
  5. 把自定义线程类加到子线程

mythread->moveToThread(thread);
connect(mythread,&MyThread::myThreadrun,this,&Widget::dealThread);

6. 启动子线程,只是把线程启动了,并没有启动线程处理函数。

```C++
connect(mythread,&MyThread::myThreadrun,this,&Widget::dealThread);
connect(this,&Widget::runThread,mythread,&MyThread::run);
qDebug() << "主线程:" << QThread::currentThread();
connect(this,&Widget::destroyed,this,&Widget::dealThreadclose);
  • 10
    点赞
  • 91
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

去留意

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值