QT學習記錄2(QT多執行緒)
阿新 • • 發佈:2018-11-23
對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停止輸出
執行效果: