对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停止输出
运行效果: