当前位置: 首页 > news >正文

开源 C++ QT Widget 开发(七)线程--多线程及通讯

 文章的目的为了记录使用C++ 进行QT Widget 开发学习的经历。临时学习,完成app的开发。开发流程和要点有些记忆模糊,赶紧记录,防止忘记。

  相关链接:

开源 C++ QT Widget 开发(一)工程文件结构-CSDN博客

开源 C++ QT Widget 开发(二)基本控件应用-CSDN博客

开源 C++ QT Widget 开发(三)图表--波形显示器-CSDN博客

开源 C++ QT Widget 开发(四)文件--二进制文件查看编辑-CSDN博客

 开源 C++ QT Widget 开发(五)通讯--串口调试-CSDN博客

开源 C++ QT Widget 开发(六)通讯--TCP调试-CSDN博客


推荐链接:

开源 java android app 开发(一)开发环境的搭建-CSDN博客

开源 java android app 开发(二)工程文件结构-CSDN博客

开源 java android app 开发(三)GUI界面布局和常用组件-CSDN博客

开源 java android app 开发(四)GUI界面重要组件-CSDN博客

开源 java android app 开发(五)文件和数据库存储-CSDN博客

开源 java android app 开发(六)多媒体使用-CSDN博客

开源 java android app 开发(七)通讯之Tcp和Http-CSDN博客

开源 java android app 开发(八)通讯之Mqtt和Ble-CSDN博客

开源 java android app 开发(九)后台之线程和服务-CSDN博客

开源 java android app 开发(十)广播机制-CSDN博客

开源 java android app 开发(十一)调试、发布-CSDN博客

开源 java android app 开发(十二)封库.aar-CSDN博客

推荐链接:

开源C# .net mvc 开发(一)WEB搭建_c#部署web程序-CSDN博客

开源 C# .net mvc 开发(二)网站快速搭建_c#网站开发-CSDN博客

开源 C# .net mvc 开发(三)WEB内外网访问(VS发布、IIS配置网站、花生壳外网穿刺访问)_c# mvc 域名下不可訪問內網,內網下可以訪問域名-CSDN博客

开源 C# .net mvc 开发(四)工程结构、页面提交以及显示_c#工程结构-CSDN博客

开源 C# .net mvc 开发(五)常用代码快速开发_c# mvc开发-CSDN博客

本章主要内容:Qt框架的多线程示例程序,主要展示了线程间通信的实现方式

一、源码分析  

1.1  线程类定义
MyThread类:

继承自QThread

包含两个信号:sendTime(QString)和firstTOsecond(QString)

run()方法中每秒发送一次时间信号和数字信号

SecondThread类:

同样继承自QThread

包含信号sendTime(QString)和槽函数dealfirstTOsecond(QString)

run()方法中每秒发送一次时间信号

1.2  主窗口类(MainWindow)
创建并管理两个线程

设置线程间的信号-槽连接

启动两个线程

多线程通信分析
线程间通信方式:
子线程 → 主线程:

firstThread::sendTime → MainWindow::firstSlot

seThread::sendTime → MainWindow::secondSlot

子线程 → 子线程:

firstThread::firstTOsecond → SecondThread::dealfirstTOsecond

线程执行流程:
MyThread线程:

每100ms循环一次

发送当前时间给主线程

发送数字"123"给SecondThread线程

SecondThread线程:

每1000ms循环一次

发送当前时间给主线程

接收并处理来自MyThread的数据

二、所有源码

2.1  mainwindow.h文件

#ifndef MAINWINDOW_H
#define MAINWINDOW_H#include <QMainWindow>
#include <mythread.h>
#include <secondthread.h>
namespace Ui {
class MainWindow;
}class MainWindow : public QMainWindow
{Q_OBJECTpublic:explicit MainWindow(QWidget *parent = 0);~MainWindow();MyThread * firstThread;SecondThread * seThread;
private:Ui::MainWindow *ui;
private slots:void firstSlot(QString t);void secondSlot(QString t);};#endif // MAINWINDOW_H

2.2  mainwindow.cpp文件

#include "mainwindow.h"
#include "ui_mainwindow.h"
/*程序包括1个主线程,2个子线程。实现子线程发送数据给主线程,子线程发送数据给子线程。* */
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)
{ui->setupUi(this);firstThread = new MyThread;//connect(firstThread,SIGNAL(sendTime(QString)),this,SLOT(firstSlot(QString)));connect(firstThread,&MyThread::sendTime,this,&MainWindow::firstSlot);seThread = new SecondThread;//connect(firstThread,SIGNAL(sendTime(QString)),this,SLOT(firstSlot(QString)));connect(seThread,&SecondThread::sendTime,this,&MainWindow::secondSlot);connect(firstThread,&MyThread::firstTOsecond,seThread,&SecondThread::dealfirstTOsecond);firstThread->start();seThread->start();}
void MainWindow::firstSlot(QString t)
{qDebug()<<"firstSlot"<<t;
}
void MainWindow::secondSlot(QString t)
{qDebug()<<"secondSlot"<<t;
}MainWindow::~MainWindow()
{delete ui;
}

2.3  mythread.h文件

#ifndef MYTHREAD_H
#define MYTHREAD_H
#include <QThread>
#include <QObject>
#include <QDebug>
#include <QTime>
class MyThread : public QThread
{Q_OBJECT
public:MyThread();
protected:void run();
signals:void sendTime(QString);void firstTOsecond(QString);
};#endif // THREAD1_H

2.4  mythread.cpp文件

#include "mythread.h"MyThread::MyThread()
{qDebug()<<"Thread Start!"<<currentThreadId();
}
void MyThread::run()
{int i = 0;QString str;while(1){qDebug()<<"first Run()!"<<currentThreadId();QString t = QTime::currentTime().toString("hh:mm:ss");//qDebug()<<i<<":"<<QDateTime::currentDateTime();emit sendTime(t);str = QString::number(i,10);emit firstTOsecond("123");msleep(100);  // 延迟1s 凸显效果}
}

2.5  secondthread.h文件

#ifndef SECONDTHREAD_H
#define SECONDTHREAD_H
#include <QThread>
#include <QObject>
#include <QDebug>
#include <QTime>
#include <QEvent>
#include <QCoreApplication>
class SecondThread : public QThread
{Q_OBJECT
public:SecondThread();protected:void run();
signals:void sendTime(QString);
public slots:void dealfirstTOsecond(QString t);
};#endif // THREAD1_H

2.6  sencondthread.cpp文件

#include "secondthread.h"SecondThread::SecondThread()
{qDebug()<<"Thread Start!"<<currentThreadId();
}
void SecondThread::run()
{int i = 0;while(1){qDebug()<<"second Run()!"<<currentThreadId();QString t = QTime::currentTime().toString("hh:mm:ss");//qDebug()<<i<<":"<<QDateTime::currentDateTime();emit sendTime(t);msleep(1000);  // 延迟1s 凸显效果}
}
void SecondThread::dealfirstTOsecond(QString t)
{qDebug()<<"deal"<<t;
}

三、显示效果

http://www.dtcms.com/a/353044.html

相关文章:

  • keepalived mysql 主从复制 容器实现(失败)
  • JVM之【Java对象在内存中的结构】
  • windows下 docker desktop 清理ext4.vhdx文件 并缩小ext4.vhdx文件
  • 二次校验请求源 IP 是否在 WAF 官方 IP 段内” + “校验是否携带 WAF 专属 HTTP 头
  • 基于Spark的白酒行业数据分析与可视化系统的设计与实现
  • [后端快速搭建]基于 Django+DeepSeek API 快速搭建智能问答后端
  • 域名、ip、DSN、URL
  • springbootr如何调用dolphinshceduler
  • 【记录】R|Windows 下的 R studio 安装调研准备工作、安装过程以及 ggplot2 包的引入测试
  • GIP电路
  • leetcode 974 和可被K整除的子数组
  • 【LeetCode 热题 100】287. 寻找重复数——双指针
  • 初始Linux——指令与权限
  • 【大前端】封装一个React Native与Android/IOS 端通用的埋点接口
  • 数据结构(C语言篇):(三)顺序表算法题解析
  • FPGA学习笔记——Verilog中可综合和常见的不可综合的系统函数
  • 数据结构:从堆中删除元素 (Deleting from a Heap)
  • 使用Spring Boot和EasyExcel导出Excel文件,并在前端使用Axios进行请求
  • linux-优化命令
  • Linux笔记11——shell编程基础-5
  • 使用appium对安卓(使用夜神模拟器)运行自动化测试
  • 解释器模式及优化
  • HIVE的Window functions窗口函数【二】
  • flume监控文件写入 Kafka 实战:解耦应用与消息队列的最佳实践
  • 性能测试-jmeter实战6
  • 日语学习-日语知识点小记-构建基础-JLPT-N3阶段(21):文法+单词第7回3
  • 学习嵌入式的第二十八天——线程
  • 趣味学Rust基础篇(变量与可变性)
  • RCLAMP0504M.TBT电子元器件Semtech 低电容、四通道TVS二极管阵
  • Web漏洞