QT 主執行緒子執行緒互相傳值
前言:
轉載請附上連線,本帖原創請勿照抄。
執行緒原始檔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);
}
相關文章
- (MFC)子執行緒的資料如何傳遞給主執行緒中?執行緒
- android 主執行緒和子執行緒之間的訊息傳遞Android執行緒
- 模擬主執行緒等待子執行緒的過程執行緒
- 保證執行緒在主執行緒執行執行緒
- qt多執行緒QT執行緒
- 多執行緒03:?執行緒傳參詳解執行緒
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- 多執行緒-執行緒控制之休眠執行緒執行緒
- 多執行緒-執行緒控制之加入執行緒執行緒
- 多執行緒-執行緒控制之禮讓執行緒執行緒
- 多執行緒-執行緒控制之中斷執行緒執行緒
- Qt---多執行緒控制QT執行緒
- Qt 中的多執行緒QT執行緒
- 主佇列&主執行緒佇列執行緒
- qt多執行緒訊號槽傳輸方式QT執行緒
- 子執行緒與UI執行緒的通訊(委託)執行緒UI
- pyqt5 子執行緒如何操作主執行緒GUIQT執行緒GUI
- 【QT】 Qt多執行緒的“那些事”QT執行緒
- 多執行緒-執行緒控制之守護執行緒執行緒
- Python雙執行緒互相控制示例Python執行緒
- 執行緒和執行緒池執行緒
- 多執行緒【執行緒池】執行緒
- 多執行緒--執行緒管理執行緒
- Java多執行緒——執行緒Java執行緒
- 執行緒 執行緒池 Task執行緒
- 執行緒與多執行緒執行緒
- Qt中的多執行緒與執行緒池淺析+例項QT執行緒
- Java多執行緒/併發07、Thread.Join()讓呼叫執行緒等待子執行緒Java執行緒thread
- 【QT】子類化QThread實現多執行緒QTthread執行緒
- 多執行緒之初識執行緒執行緒
- Java多執行緒-執行緒中止Java執行緒
- 執行緒控制之休眠執行緒執行緒
- Java多執行緒——執行緒池Java執行緒
- c#執行緒-執行緒同步C#執行緒
- 多執行緒-執行緒概述等執行緒
- 執行緒1-單執行緒執行緒
- 執行緒3--執行緒安全執行緒
- 執行緒同步及執行緒鎖執行緒