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)子執行緒的資料如何傳遞給主執行緒中?執行緒
- 模擬主執行緒等待子執行緒的過程執行緒
- 保證執行緒在主執行緒執行執行緒
- qt多執行緒QT執行緒
- Python雙執行緒互相控制示例Python執行緒
- 多執行緒03:?執行緒傳參詳解執行緒
- 多執行緒------執行緒與程式/執行緒排程/建立執行緒執行緒
- 【QT】子類化QThread實現多執行緒QTthread執行緒
- QT執行緒的使用 moveToThread()QT執行緒thread
- 主佇列&主執行緒佇列執行緒
- 【QT】 Qt多執行緒的“那些事”QT執行緒
- 子執行緒與UI執行緒的通訊(委託)執行緒UI
- pyqt5 子執行緒如何操作主執行緒GUIQT執行緒GUI
- 執行緒和執行緒池執行緒
- 多執行緒--執行緒管理執行緒
- 執行緒與多執行緒執行緒
- 執行緒 執行緒池 Task執行緒
- 多執行緒【執行緒池】執行緒
- 66.QT-執行緒併發、QTcpServer併發、QThreadPool執行緒池QT執行緒TCPServerthread
- Qt中的多執行緒與執行緒池淺析+例項QT執行緒
- Swift多執行緒:使用Thread進行多執行緒間通訊,協調子執行緒任務Swift執行緒thread
- Java多執行緒-執行緒中止Java執行緒
- 多執行緒之初識執行緒執行緒
- 執行緒控制之休眠執行緒執行緒
- 【多執行緒總結(二)-執行緒安全與執行緒同步】執行緒
- 主執行緒等待所有其他執行緒執行完畢,然後再繼續執行主執行緒的邏輯,有以下幾種方法可以實現:執行緒
- 執行緒、開啟執行緒的兩種方式、執行緒下的Join方法、守護執行緒執行緒
- java執行緒之守護執行緒和使用者執行緒Java執行緒
- 執行緒(一)——執行緒,執行緒池,Task概念+程式碼實踐執行緒
- PyQt應用程式中的多執行緒:使用Qt還是Python執行緒?QT執行緒Python
- 多執行緒系列之 執行緒安全執行緒
- 二. 執行緒管理之執行緒池執行緒
- iOS 多執行緒之執行緒安全iOS執行緒
- Java多執行緒之執行緒中止Java執行緒
- Android多執行緒之執行緒池Android執行緒
- Java多執行緒-執行緒狀態Java執行緒
- Java多執行緒-執行緒通訊Java執行緒
- kuangshenshuo-多執行緒-執行緒池執行緒