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);

}
扫描二维码关注公众号,回复: 13116744 查看本文章

猜你喜欢

转载自blog.csdn.net/qq_37529913/article/details/110506178