Day23QThread线程创建与使用2021-12-02

Qt线程创建与使用

简介

Qt的线程类QThread提供了常用方法,需要集成后使用。提供了线程入口函数run,这是一个受保护的虚函数,需要重新实现自定义代码。下面创建一个小的场景,线程的开始与停止受到主界面的按钮控制,一旦线程开始运行,则发出超时信号(时间间隔对外提供方法设置),主线程接收超时信号并进行处理,让LCD显示部件加1。

步骤

1.创建主界面类,并设计ui界面如下:
Day23QThread线程创建与使用2021-12-02_第1张图片
2.新建c++类继承自QThread
a.新建类继承时通常选择继承自QWidget,等待创建好之后在修改。添加QThread头文件;修改从哪个类继承,在代码部分我已做了标注。
b.重新run函数,run函数重写成每隔固定的时间间隔发出一个信号。
c.对外提供一个可以修改这个时间间隔的方法
3.主线程中创建子线程类对象
a.使用按钮控制子线程的开始与暂停
b.接收子线程的信号,并进行处理,让LCD每次收到信号加1。

注意

在信号与槽 一节提到过connect函数第五个参数的作用,采用Qt::BlockingQueuedConnection参数让子线程阻塞,直到主线程处理完毕,也就是同步处理,区别于Qt::QueuedConnection参数等控制权回到主线程在执行处理。这是需要注意的一点,实际应用中应结合具体的应用需求选择合适的参数。

效果

与代码部分一致,每2秒发送一次信号

代码

main

#include "widget.h"
#include 
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();
    return a.exec();
}

widget.h主线程

#ifndef WIDGET_H
#define WIDGET_H
#include 
#include "mythread.h"
QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE
class Widget : public QWidget
{
    Q_OBJECT
public:
    Widget(QWidget *parent = nullptr);
    ~Widget();
private slots:
    void doProcessTimeOut();
    void on_startBtn_clicked();
    void on_stopBtn_clicked();
private:
    Ui::Widget *ui;
    myThread *thr;
    int index;
};
#endif // WIDGET_H

widget.cpp主线程

#include "widget.h"
#include "ui_widget.h"
Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);
    index = 0;
    thr = new myThread(this);
    connect(thr,SIGNAL(signalTimeOut()),this,SLOT(doProcessTimeOut()));
}
Widget::~Widget()
{
    delete ui;
}
void Widget::doProcessTimeOut()
{
    index++;
    if(index==101)
    {
        index=0;
    }
    ui->lcdNumber->display(index);
}
void Widget::on_startBtn_clicked()
{
    //可修改时间间隔
    thr->setTimeSecend(2);//修改每两秒加1
    thr->start();
}
void Widget::on_stopBtn_clicked()
{
    thr->terminate();
}

mythread.h子线程

#ifndef MYTHREAD_H
#define MYTHREAD_H
#include 
#include //添加头文件
class myThread : public QThread//继承修改1
{
    Q_OBJECT
public:
    explicit myThread(QWidget *parent = nullptr);//构造函数参数,可不改
    void setTimeSecend(int sec);
protected:
    void run();
signals:
    signalTimeOut();
private:
    int time_sec;
};
#endif // MYTHREAD_H

mythread.cpp

#include "mythread.h"
myThread::myThread(QWidget *parent) : QThread(parent)//继承修改2
{
    time_sec = 1;
}
void myThread::run()
{
    while (1) {
        sleep(time_sec);
        emit signalTimeOut();
    }
}
void myThread::setTimeSecend(int sec)
{
    time_sec = sec;
}

你可能感兴趣的:(Qt积累——基础篇,qt,ui,开发语言)