QT 主執行緒子執行緒互相傳值

斷點_Dream2017發表於2020-12-02

前言:

轉載請附上連線,本帖原創請勿照抄。

執行緒原始檔mythread.h、.cpp;主執行緒檔案mainwindow.h、.cpp;

下面程式先從主執行緒呼叫子執行緒,子執行緒給主執行緒返回1;主執行緒再給子執行緒傳送帶參訊號子執行緒列印收到的訊號。

mythread.h

class mythread : public QThread
{
        Q_OBJECT
public:
    mythread();


    //QThread的虛擬函式
    //執行緒處理函式
    //不能直接呼叫,通過start()間接呼叫
    void run();
signals:
    void isDone(int);  //處理完成訊號

public slots:
    //接收主執行緒的訊息
    void recMegFromMain(QString);
};

mythread.cpp

mythread::mythread()
{

}
void mythread::run()
{
    emit isDone(1);  //傳送完成訊號
}
void mythread::recMegFromMain(QString str)
{
    qDebug()<< "子執行緒接收到" <<str;
}

mainwindow.h

#ifndef MAINWINDOW_H
#define MAINWINDOW_H

#include <QMainWindow>
#include "mythread.h"
#include <QDebug>
#include <QMessageBox>

QT_BEGIN_NAMESPACE
namespace Ui { class MainWindow; }
QT_END_NAMESPACE

class MainWindow : public QMainWindow
{
        Q_OBJECT
public:
    MainWindow(QWidget *parent = nullptr);
    ~MainWindow();

    //接收子執行緒槽函式
    void receiveMsgFromThread(int);

    //子執行緒發射訊號槽函式
    void sengMsgToThreadBtn();

 //分配空間
private slots:
    void on_pushButton_clicked();

    void on_pushButton_2_clicked();

    void on_pushButton_3_clicked();

private:
    Ui::MainWindow *ui;
    mythread *thread;

signals:
    //給子執行緒發訊息
    void sengMsgToThread(QString);
};
#endif // MAINWINDOW_H

mainwindow.cpp

//建構函式部分
MainWindow::MainWindow(QWidget *parent)
    : QMainWindow(parent)
    , ui(new Ui::MainWindow)
{
    ui->setupUi(this);

    thread = new mythread;  //分配空間
    consumer = new WriterThread;  //分配空間
    writer = new Consumer;

    //關閉介面時,殺死執行緒
    connect(this, &MainWindow::destroyed, this, &MainWindow::dealDone);

    //接收子執行緒發來的資料
    connect(thread, &mythread::isDone, this, &MainWindow::receiveMsgFromThread);

    //發資料給子執行緒
    connect(this, &MainWindow::sengMsgToThread, thread, &mythread::recMegFromMain);
}


//主執行緒呼叫函式,觸發訊號給子執行緒發訊息
void MainWindow::on_pushButton_clicked()
{
    sengMsgToThreadBtn();

}
//給子執行緒發訊號和引數
void MainWindow::sengMsgToThreadBtn()
{
    emit sengMsgToThread("hello");
}

//接收子執行緒函式
void MainWindow::receiveMsgFromThread(int i)
{
    QString str = QString::number(i);
    qDebug()<<str;
}

//啟動執行緒
void MainWindow::on_pushButton_2_clicked()
{

    thread->start();

    //啟動執行緒,處理資料
    ui->label->setText("執行緒啟動");

}
//停止執行緒呼叫
void MainWindow::dealDone()
{
    ui->label->setText("執行緒停止");

    //停止執行緒
   thread->quit();
   //consumer->quit();
   //writer->quit();
   //等待執行緒處理完手頭工作
   thread->wait();
   //consumer->wait();
   //writer->wait();
   ui->pushButton_2->setEnabled(true);
   ui->pushButton->setEnabled(false);

}

 

 

相關文章