QT 主线程子线程互相传值
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
- 点赞
- 收藏
- 关注作者
评论(0)