1. 程式人生 > >QT學習記錄2(QT多執行緒)

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停止輸出

執行效果: