QT 主线程子线程互相传值

举报
华为云 断点 发表于 2023/02/16 19:46:45 2023/02/16
【摘要】 QT多线程编程系列专栏文章共有12篇,全面的讲述、实现、运行了QT多线程的各种操作,包括运行原理、线程、进程、多线程、锁、QMutex、QSemaphore、 Emit、Sgnals、Slot、QWaitCondition、线程事件循环、QObjects、重入与线程安全、主线程子线程互相传值、线程同步与异步处理、线程的使用、浅拷贝、深拷贝、隐式共享、隐式共享机制对STL样式迭代器的影响等等文章。

 QT多线程编程系列专栏文章共有12篇,全面的讲述、实现、运行了QT多线程的各种操作,包括运行原理、线程、进程、多线程、锁、QMutex、QSemaphore、 Emit、Sgnals、Slot、QWaitCondition、线程事件循环、QObjects、重入与线程安全、主线程子线程互相传值、线程同步与异步处理、线程的使用、浅拷贝、深拷贝、隐式共享、隐式共享机制对STL样式迭代器的影响等等文章。

本文实现了主线程给子线程传值、子线程给主线程传值。主线程子线程的互相传值。线程源文件mythread.h、.cpp;主线程文件mainwindow.h、.cpp;下面程序先从主线程调用子线程,子线程给主线程返回1;主线程再给子线程发送带参信号子线程打印收到的信号。

本文作者原创首发于CSDN,本文原创请勿转载

版权声明:本文为CSDN博主「双子座断点」的原创文章,遵循CC 4.0 BY-SA版权协议。
原文链接:https://blog.csdn.net/qq_37529913/article/details/110127940

线程源文件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);
 
}

以下文章均为作者原创文章,看完记得收藏、关注加👍

线程、进程、多线程、线程池一文看懂从此秒变大佬!:https://blog.csdn.net/qq_37529913/article/details/115533429

QT 初识线程(简单实现):https://blog.csdn.net/qq_37529913/article/details/110127940

QT QMutex使用详解:https://blog.csdn.net/qq_37529913/article/details/110187452

QT 线程之QSemaphore(深入理解):https://blog.csdn.net/qq_37529913/article/details/110187121

QT线程 Emit、Sgnals、Slot详细解释:https://blog.csdn.net/qq_37529913/article/details/110211435

QT 线程之QWaitCondition(深入理解):https://blog.csdn.net/qq_37529913/article/details/110212704

Qt 多线程之线程事件循环(深入理解):https://blog.csdn.net/qq_37529913/article/details/110229382

QT线程之QObjects(深入理解):https://blog.csdn.net/qq_37529913/article/details/110228837

QT线程之可重入与线程安全(深入理解):https://blog.csdn.net/qq_37529913/article/details/110224166

QT 主线程子线程互相传值:https://blog.csdn.net/qq_37529913/article/details/110506178

QT线程同步与异步处理:https://blog.csdn.net/qq_37529913/article/details/110521759

QT 多线程之线程池QThreadPool(深入理解):https://blog.csdn.net/qq_37529913/article/details/115536799

QT之浅拷贝、深拷贝、隐式共享(深度理解必看文章):https://blog.csdn.net/qq_37529913/article/details/110235596

QT 隐式共享机制对STL样式迭代器的影响:https://blog.csdn.net/qq_37529913/article/details/110252454

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。