栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 软件开发 > 后端开发 > C/C++/C#

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

C/C++/C# 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

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

Qt线程创建与使用 简介

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

步骤

1.创建主界面类,并设计ui界面如下:

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;
}
转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/630261.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号