开源 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_OBJECT

public:
    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;
}

三、显示效果

相关推荐
@LetsTGBot搜索引擎机器人2 分钟前
2025 Telegram 最新免费社工库机器人(LetsTG可[特殊字符])搭建指南(含 Python 脚本)
数据库·搜索引擎·机器人·开源·全文检索·facebook·twitter
驴友花雕2 分钟前
【花雕学编程】Arduino BLDC 之仿人机器人膝关节稳定系统
c++·单片机·嵌入式硬件·arduino bldc·仿人机器人膝关节稳定系统
Qhumaing10 分钟前
C++学习:【PTA】数据结构 7-1 实验7-1(最小生成树-Prim算法)
c++·学习·算法
Uncertainty!!1 小时前
Linux多用户情况下个别用户输入密码后黑屏
linux·远程连接
necessary6531 小时前
使用Clion查看linux环境中的PG源码
linux·运维·服务器
Z1Jxxx2 小时前
01序列01序列
开发语言·c++·算法
坚定学代码3 小时前
基于观察者模式的ISO C++信号槽实现
开发语言·c++·观察者模式·ai
小猪佩奇TONY3 小时前
Linux 内核学习(14) --- linux x86-32 虚拟地址空间
linux·学习
Lam㊣3 小时前
Centos 7 系统docker:更换镜像源
linux·docker·centos
FL16238631293 小时前
win11+WSL+Ubuntu-xrdp+远程桌面闪退+黑屏闪退解决
linux·运维·ubuntu