首页 > 其他分享 >VS2022+QT6.7.2 子线程与主线程通信(详细)(注释)

VS2022+QT6.7.2 子线程与主线程通信(详细)(注释)

时间:2024-08-12 18:24:02浏览次数:16  
标签:QT6.7 myslot2 mythread 线程 VS2022 QtWidgetsApplication13 include QString

需求:主线程将需要计算的数据发送给子线程,子线程将计算后的结果返回给主线程。

实现逻辑:(前提:子线程类已创建好,并使用start方法启动子线程)

1、主线程的mysignal1信号触发子线程的myslot2槽函数

方法:connect(this, &QtWidgetsApplication13::mysignal1, st, &mythread::myslot2); 

2、子线程的myslot2槽函数中的mysignal2信号触发主线程的myslot1槽函数

方法: connect(st,&mythread::mysignal2,this,&QtWidgetsApplication13::myslot1);

具体实现如下:

#include "QtWidgetsApplication13.h"

#pragma once
#include <QtWidgets/QMainWindow>
#include "ui_QtWidgetsApplication13.h"
#include<QThread> //线程类
#include<QDebug>  //调试
#include<QString>  //字符串类

class QtWidgetsApplication13 : public QMainWindow //主窗口类,主线程
{
    Q_OBJECT  // 宏,必须

public:
    QtWidgetsApplication13(QWidget *parent = nullptr); //构造函数
    ~QtWidgetsApplication13();  //析构函数

public slots:
        void myslot1(QString);  //槽函数

signals:
        void mysignal1(QString); //信号

private:
    Ui::QtWidgetsApplication13Class ui; //ui
};

class mythread : public QObject //子线程类
{
    Q_OBJECT // 宏,必须

public slots:
    void myslot2(QString); //槽函数

signals:
    void mysignal2(QString);  //信号
};

#include "QtWidgetsApplication13.cpp"

#include "QtWidgetsApplication13.h"

QtWidgetsApplication13::QtWidgetsApplication13(QWidget *parent)
    : QMainWindow(parent)
{   ui.setupUi(this);
    QThread *thread = new QThread(); //创建线程对象
    mythread *st= new mythread(); //创建工作对象
    st->moveToThread(thread); //将工作对象移动到线程
    thread->start(); //启动子线程,mysignal1信号手动触发线程开始执行

    //主线程中信号触发线程启动,执行子线程的myslot2槽
    connect(this, &QtWidgetsApplication13::mysignal1, st, &mythread::myslot2); 
    
    //子线程myslot2槽函数中触发mysignal2信号,执行主线程的myslot1槽
    connect(st,&mythread::mysignal2,this,&QtWidgetsApplication13::myslot1);

    //点击pushButton启动线程,并发送信号
    connect(ui.pushButton, &QPushButton::clicked, this, [=]() { 
        mysignal1("10000");  //给子线程发送信号“10000”
        });
}

void mythread::myslot2(QString str) //子线程的槽函数
{
    int i=0,a; //定义变量
    a=str.toInt(); //将QString转换为int
    qDebug()<<"子线程ID"<<QThread::currentThreadId();
    while(i<a) //循环10000次
    {
        str=QString::number(i); //将int转换为QString
        i++; //自增
        emit mysignal2(str); //发送信号
        QThread::msleep(30); //休眠30ms
    }
}

void QtWidgetsApplication13::myslot1(QString str) //主线程的槽函数
{
    ui.textEdit->append(str); //向textEdit输出
}

QtWidgetsApplication13::~QtWidgetsApplication13() //析构函数
{ 
}



#include "main.cpp"

#include "QtWidgetsApplication13.h"
#include <QtWidgets/QApplication>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QtWidgetsApplication13 w;
    qDebug() << "主线程ID" << QThread::currentThreadId();
    w.show();
    return a.exec();
}

具体实现效果如下:

ui中拖入一个pushbutton按钮,TextEdit文本列表框

标签:QT6.7,myslot2,mythread,线程,VS2022,QtWidgetsApplication13,include,QString
From: https://blog.csdn.net/ZJQSDSA/article/details/141023582

相关文章

  • 线程与进程
    多线程多线程的创建方式方式1:继承于Thread类1.创建一个集成于Thread类的子类(通过ctrl+o(override)输入run查找run方法)2.重写Thread类的run()方法3.创建Thread子类的对象4.通过此对象调用start()方法start与run方法的区别:start方法的作用:1.启动当前线程2.调用当前线程的重写......
  • 关于异步编程和多线程的高级.NET Core面试题
    以下是一些关于异步编程和多线程的高级.NETCore面试题。这些问题涵盖了从基础概念到复杂应用的各个方面,可以帮助评估候选人在异步编程和多线程开发方面的能力。1.异步编程基础在.NETCore中,异步编程的基本原理是什么?async和await关键字的作用是什么?如何在.NETCore中使用......
  • Java线程池和执行流程
    在Java中,常见的四种线程池包括:1.newFixedThreadPool(固定大小线程池)应用场景:适用于需要限制线程数量,并且任务执行时间比较均匀的场景,例如服务器端的连接处理。优点:线程数量固定,能够有效地控制并发线程数,避免过多的线程竞争资源。缺点:如果线程在执行任务过程中出现异常......
  • vs2022 x64 C/C++和汇编混编 遇到的坑
    vs2022x64C/C++和汇编混编遇到的坑遇到的问题二、问题复现1.出错代码2.问题分析2.1堆栈对齐问题3.解决方案总结奇数和偶数个寄存器的影响为什么`subrsp,8`对奇数个寄存器有用?结论遇到的问题0x00007FFFFAE24A29(msvcp140.dll)处(位于TestCompileConsol......
  • 线程与多线程
    1.线程1.线程状态线程状态分为5种newrunable->分为ready和running阻塞等待->分为waiting和time_waiting销毁1.2线程数量配置IO密集型=CPU*2cpu密集型=CPU+12.线程池2.1线程池核心参数线程池一共7个核心参数,分别是核心线程数、最大线程数......
  • Linux:线程同步机制(互斥锁、读写锁、条件变量、信号量详细分析总结)
    目录速览1、互斥锁(1)What(什么是互斥锁)(2)Why(互斥锁的用途)(3)How(如何使用互斥锁)(4)代码实践2、读写锁(1)What(什么是读写锁)(2)Why(读写锁的作用)(3)How(如何使用读写锁)(4)读写锁的特征3、条件变量(1)What(什么是条件变量)(2)Why(条件变量的作用)(3)How(如何使用条件变量实现线程......
  • 多线程复习总结
     1基本概念1什么是进程什么是线程进程:是程序执行一次的过程,他是动态的概念,是资源分配的基本单位。一个应用程序(1个进程是一个软件)。线程:一个进程可以有多个线程,线程是cpu调度的单位,一个进程中的执行场景/执行单元。对于java程序来说,当在DOS命令窗口中输入:javaHelloWorld回......
  • 单例模式-饿汉、懒汉(线程安全、双重检查锁定)、静态内部类、枚举
    1饿汉式这种方式是最简单的单例模式实现,它在类加载的时候就创建了单例对象。优点实现简单线程安全缺点无论是否使用,都会加载单例类并创建单例对象publicclassSingleton{privatestaticfinalSingletonINSTANCE=newSingleton();privateSingleton(){......
  • 【Redis进阶】Redis单线程模型和多线程模型
    目录单线程为什么Redis是单线程处文件事件理器的结构文件处理器的工作流程总结文件事件处理器连接应答处理器命令请求处理器命令回复处理器多线程为什么引入多线程多线程架构多线程执行流程关于Redis的问题Redis为什么采用单线程模型Redis为什么要引入多线程呢......
  • Linux C++ 多线程编程
    LinuxC++多线程编程参考教程:c++:互斥锁/多线程的创建和unique_lock<mutex>的使用_mutex头文件vc++-CSDN博客1.编写unique_mutex1.1创建文件夹通过终端创建一个名为unique_mutex的文件夹以保存我们的VSCode项目,在/unique_mutex目录下打开vscode。rosnoetic@rosnoetic-Virt......