QT学习记录2(QT多线程)

对QT多线程的理解

qt多线程基于QThread类,在使用的时候,可以选择新建类,然后继承QThread类,然后重写run函数,从而实现QT多线程

 

QT多线程小例程

首先,创建一个QT工程,名字叫做mythread,窗口选择widget,然后一路下一步即可,生成这样的文件结构

 然后右键,选择添加新文件,分别添加一个mythread.h  和  mythread.cpp

 然后文件目录结构就会是这样:

 然后就需要完善各个文件中的代码,代码很简洁,直接上图

mythread.h  头文件

/*   mythread.h文件    */
#include <QThread>
#include <QObject>
#include <QDebug>

#ifndef MYTHREAD_H
#define MYTHREAD_H

class Mythread :public QThread
{
   Q_OBJECT
public:
   void run();   //run函数,这个就是多线程的线程函数

signals:
   void send_output_text(QString);   //这个用作给UI界面发消息显示用的

private slots:
   void thread_start();    //线程启动槽函数,接收到主线程的启动信号,就会触发
   void thread_exit();     //线程结束槽函数,接收到主线程的结束信号,就会触发

};



#endif // MYTHREAD_H

 widget.h  头文件

/*widet.h文件*/

#ifndef WIDGET_H
#define WIDGET_H

#include <QWidget>

namespace Ui {
class Widget;
}

class Widget : public QWidget
{
    Q_OBJECT

public:
    explicit Widget(QWidget *parent = 0);
    ~Widget();

signals:
    void send_thread_start();    //发出启动信号
    void send_thread_exit();     //发出结束信号

private slots:
    void on_btn_start_clicked();    //start按钮被点击槽函数
    void on_btn_exit_clicked();     //exit按钮被点击槽函数
    void append_text(QString);      //文本框添加文本槽函数

private:
    Ui::Widget *ui;
};

#endif // WIDGET_H

main.cpp  文件

/*  main.cpp文件   */

#include "widget.h"
#include <QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    Widget w;
    w.show();

    return a.exec();
}

 mythread.cpp文件

/*mythread.cpp文件*/
#include "mythread.h"

void Mythread::run()   //多线程执行函数
{
    while(1)
    {
        emit send_output_text("hello");
        sleep(1);
    }
}


void Mythread::thread_start()   //线程启动槽函数
{
    this->start();
}

void Mythread::thread_exit()    //线程结束槽函数
{
    this->terminate();   //结束线程
    this->wait();        //等待线程结束,回收资源
}

widget.cpp 文件

/*widet.cpp文件*/

#include "widget.h"
#include "ui_widget.h"
#include "mythread.h"

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

    Mythread *myth = new Mythread();     //实例化一个MYthread对象出来
    connect(this, SIGNAL(send_thread_start()), myth, SLOT(thread_start()));  //线程启动
    connect(this, SIGNAL(send_thread_exit()), myth, SLOT(thread_exit()));    //线程终止
    connect(myth, SIGNAL(send_output_text(QString)), this, SLOT(append_text(QString))); //文本显示
}

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

void Widget::on_btn_start_clicked()   //start按钮被点击槽函数
{
    emit send_thread_start();
}

void Widget::on_btn_exit_clicked()   //exit按钮被点击槽函数
{
    emit send_thread_exit();
}

void Widget::append_text(QString str)   //编辑框追加文本槽函数
{
    ui->output->append(str);     //编辑框的名字叫做output
}

粗略的拖了几个控件出来,主界面是这样的

程序目的是为了按下 Start之后,编辑框会间隔1秒 输出 hello  ,按下exit停止输出

运行效果:

猜你喜欢

转载自blog.csdn.net/zh15237774494/article/details/83241300
今日推荐