Qt5基础 为什么要使用线程?

44 阅读2分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 10 月更文挑战」的第20天,点击查看活动详情

Qt5基础系列

Qt基础的学习笔记。此文章为在B站上学习黑马程序员Qt教程的为什么要使用线程部分做的记录,加深理解,方便回看。 @TOC

一、为什么要使用线程?

我们通过一个代码示例来解释:

1、头文件

声明了一个公有定时器槽函数和一个私有定时器变量,以及一个按钮点击事件。

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>
#include <QTimer> //定时器头文件

QT_BEGIN_NAMESPACE
namespace Ui { class Widget; }
QT_END_NAMESPACE

class Widget : public QWidget
{
    Q_OBJECT

public:
    Widget(QWidget *parent = nullptr);
    ~Widget();

    void dealTimeout();//定时器槽函数

private slots:
    void on_pushButton_clicked();

private:
    Ui::Widget *ui;

    QTimer *myTimer;//声明定时器变量
};
#endif // WIDGET_H

2、引入类

#include "widget.h"
#include "ui_widget.h"
#include <QThread>
#include <QDebug>

3、主程序

我们设置了一个定时器,实现计时,设置了一个按钮来启动定时。

Widget::Widget(QWidget *parent)
    : QWidget(parent)
    , ui(new Ui::Widget)
{
    ui->setupUi(this);

    myTimer = new QTimer(this);

    //只要定时器启动,自动触发timeout()
    //myTimer向本窗口发送timeout类型的请求,槽函数为dealTimeout
    connect(myTimer,&QTimer::timeout,this,&Widget::dealTimeout);

}

void Widget::dealTimeout()
{
    static int i = 0;
    i++;
    //设置lcd的值
    ui->lcdNumber->display(i);
}

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


void Widget::on_pushButton_clicked()
{
    //
    if(myTimer->isActive()== false)
    {
        myTimer->start(100);
    }
    //非常复杂的数据处理,耗时间长
    QThread::sleep(5);//这边在sleep,所以反馈无响应

    //处理完数据后,关闭定时器,等sleep完了,也结束了,所以定时器没有显示出来
    //myTimer->stop();
    qDebug() << "over";
    
}

4、截图及分析

在这里插入图片描述

在本示例中,这里5s内无响应,点击启动在5s后才开始计时。所以sleep和计时是先后工作。如果我们希望复杂的数据处理(比如sleep)能够和定时器同时工作,则需要用到线程,多个任务同时进行。

二、总结

以上简单介绍了为什么要使用线程。接下来会记录多线程的使用。