Qt笔记(9) qt多线程-run() 形式

C++ Qt 专栏收录该内容
11 篇文章 0 订阅

介绍使用 Qt run() 开启线程的基本函数,信号,槽,已经过程。

#ifndef MYTHREAD_H
#define MYTHREAD_H

#include <QThread>

class MyThread : public QThread
{
    Q_OBJECT
public:
    explicit MyThread(QObject *parent = nullptr);
    //start函数间接调用了run()
    void run();
signals:
    void isDoneSignal();

public slots:
};

#endif // MYTHREAD_H

#ifndef MYWIDGET_H
#define MYWIDGET_H

#include <QWidget>
#include <QTimer>
#include "mythread.h"
namespace Ui {
class MyWidget;
}

class MyWidget : public QWidget
{
    Q_OBJECT

public:
    explicit MyWidget(QWidget *parent = nullptr);
    ~MyWidget();
public slots:
    void executeslot();
private slots:
    void on_pushButton_clicked();
    void dealThreadSlot();
    void mythreadStartedSlot();
    void mythreadFinishedSlot();
    void stopThread();

private:
    Ui::MyWidget *ui;
    QTimer *myTimer;
    MyThread *thread;
};

#endif // MYWIDGET_H

#include "mythread.h"
#include <QDebug>
MyThread::MyThread(QObject *parent) : QThread(parent)
{

}
void MyThread::run()
{
    //耗时操作
    qDebug() << QString("MyThread thread id:") << QThread::currentThreadId();
    sleep(5);
    qDebug()<<"线程正在执行耗时操作";
    emit isDoneSignal();
    qDebug()<<"run()函数执行结束";
}

#include "mywidget.h"
#include "ui_mywidget.h"
#include <QThread>
#include <QDebug>


MyWidget::MyWidget(QWidget *parent) :
    QWidget(parent),
    ui(new Ui::MyWidget)
{
    ui->setupUi(this);
    qDebug() << QString("MyWidget thread id:") << QThread::currentThreadId();
    myTimer = new QTimer(this);
    thread = new MyThread(this);
    connect(myTimer, SIGNAL(timeout()),this, SLOT(executeslot()));
    connect(thread,SIGNAL(isDoneSignal()),this,SLOT(dealThreadSlot()));
    connect(thread,SIGNAL(started()),this,SLOT(mythreadStartedSlot()));
    connect(thread,SIGNAL(finished()),this,SLOT(mythreadFinishedSlot()));
    //按窗口右上角的X 时,窗口触发destroyed()
    connect(this,SIGNAL(destroyed()),this,SLOT(stopThread()));
}


MyWidget::~MyWidget()
{
    delete ui;
}

void MyWidget::executeslot()
{
    QTimer *tptime = qobject_cast<QTimer *>(sender());
    static int i = 0;
    i++;
    if (i==1)
    {
        qDebug()<<"定时器超时了,定时器id= "<<tptime->timerId();
    }
    ui->lcdNumber->display(i);
}
void MyWidget::dealThreadSlot()
{
    MyThread *tpMythread = qobject_cast<MyThread*>(sender());
    qDebug()<<"线程是否结束:"<<tpMythread->isFinished();
    qDebug()<<"线程是否正在运行:"<<tpMythread->isRunning();
    qDebug()<<"返回线程优先级:"<<tpMythread->priority();
    qDebug()<<"耗时操作已结束,关闭定时器";
    myTimer->stop();
}
void MyWidget::stopThread()
{
    //停止线程
    thread->quit();
    //等待线程处理完其他工作,回收资源
    thread->wait();
    qDebug()<<"中断线程";
}
void MyWidget::on_pushButton_clicked()
{
    if(myTimer->isActive() == false)
    {
        myTimer->start(100); //每隔100ms,超时一次
    }

    //开启线程,start() 间接调用run()
    thread->start();

}

void MyWidget::mythreadStartedSlot()
{
    qDebug()<<"线程开始执行了,在run() 函数之前。";

}
void MyWidget::mythreadFinishedSlot()
{
     qDebug()<<"线程已经执行结束了";
}

"MyWidget thread id:" 0x4690
"MyThread thread id:" 0x5a30
线程开始执行了,在run() 函数之前。
定时器超时了,定时器id=  3
线程正在执行耗时操作
run()函数执行结束
线程是否结束: true
线程是否正在运行: false
返回线程优先级: 7
耗时操作已结束,关闭定时器
线程已经执行结束了

在这里插入图片描述

  • 0
    点赞
  • 0
    评论
  • 3
    收藏
  • 打赏
    打赏
  • 扫一扫,分享海报

参与评论 您还未登录,请先 登录 后发表或查看评论
©️2022 CSDN 皮肤主题:游动-白 设计师:我叫白小胖 返回首页

打赏作者

qq_31759493

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

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

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

打赏作者

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

抵扣说明:

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

余额充值