[QT编程系列-24]:多线程机制 - QT的数据通信机制

目录

第1章 QT常见的数据通信机制

第2章 示例代码

1. 信号和槽机制示例:

2. 共享数据/变量示例:

3. 本地套接字示例:


第1章 QT常见的数据通信机制

在Qt中,有多种方式可以实现数据通信,下面列举了一些常用的方法:

  1. 信号和槽机制:Qt的信号和槽机制是一种基于事件的机制,用于在对象之间进行通信。通过在发送方对象中定义信号,并在接收方对象中定义槽函数,并使用connect函数将信号和槽函数连接起来,就可以实现对象之间的数据通信。信号可以带有参数,将数据传递给槽函数。

  2. 事件机制:Qt中的对象可以通过定义和触发自定义事件来实现数据通信。通过继承QEvent类并重写相关函数,在发送方对象中创建并发送事件,在接收方对象中重写事件处理函数来接收并处理事件。

  3. 共享数据/变量:使用共享数据或变量是一种简单的通信方式。可以在多个对象之间共享数据,通过对数据的读写进行同步保护,以确保多线程环境下的数据一致性。Qt提供了互斥锁(QMutex)和读写锁(QReadWriteLock)等同步原语,可用于实现数据的同步访问。

  4. 本地套接字:Qt提供了QLocalSocketQLocalServer类,用于在同一台机器上的进程之间进行本地通信。可以使用本地套接字来实现进程之间的数据交换。一个进程可以作为服务器端使用QLocalServer监听连接请求,另一个进程可以作为客户端使用QLocalSocket连接服务器并发送/接收数据。

  5. 网络套接字:Qt的QTcpSocketQUdpSocket类提供了与远程计算机上的进程进行通信的功能,可以实现网络数据通信。QTcpSocket可以用于建立TCP连接,而QUdpSocket适用于使用UDP协议进行数据通信。

  6. Qt Remote Objects:Qt Remote Objects(Qt远程对象)是一个用于分布式数据通信的框架。它可以在不同的进程、设备或网络中的Qt应用程序之间实现数据和信号的交换。使用Qt Remote Objects,你可以定义和使用分布式对象,通过远程调用和信号槽机制进行数据通信。

以上仅是一些常用的Qt数据通信方式,Qt还提供了其他更多的通信工具和机制,如QtDBus用于D-Bus数据交互、QtWebSockets用于WebSocket通信等,你可以根据具体需求选择合适的通信方式,具体的选择取决于你的应用需求以及数据通信的特点。

第2章 示例代码

下面是一些简单的示例代码,演示了Qt中不同的数据通信机制:

1. 信号和槽机制示例:

// Sender.h
#ifndef SENDER_H
#define SENDER_H#include <QObject>class Sender : public QObject
{Q_OBJECT
public:explicit Sender(QObject *parent = nullptr);signals:void dataReady(int data);
};// Receiver.h
#ifndef RECEIVER_H
#define RECEIVER_H#include <QObject>class Receiver : public QObject
{Q_OBJECT
public:explicit Receiver(QObject *parent = nullptr);public slots:void processData(int data);
};// main.cpp
#include <QCoreApplication>
#include "Sender.h"
#include "Receiver.h"int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);Sender sender;Receiver receiver;// 将Sender的dataReady信号与Receiver的processData槽函数连接QObject::connect(&sender, &Sender::dataReady, &receiver, &Receiver::processData);// 发送数据sender.emit dataReady(123);return a.exec();
}

2. 共享数据/变量示例:

// Worker.h
#ifndef WORKER_H
#define WORKER_H#include <QObject>
#include <QMutex>class Worker : public QObject
{Q_OBJECT
public:explicit Worker(QObject *parent = nullptr);public slots:void writeData(int data);signals:void readData(int data);private:QMutex mutex;int sharedData;
};// main.cpp
#include <QCoreApplication>
#include "Worker.h"int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);Worker worker;// 将共享数据的读写操作放在互斥锁中进行保护worker.writeData(123);QMutexLocker locker(&worker.mutex); // 自动加锁int data = worker.sharedData;locker.unlock(); // 解锁worker.emit readData(data);return a.exec();
}

3. 本地套接字示例:

// Server.h
#ifndef SERVER_H
#define SERVER_H#include <QObject>
#include <QLocalServer>
#include <QLocalSocket>class Server : public QObject
{Q_OBJECT
public:explicit Server(QObject *parent = nullptr);signals:public slots:void newConnection();private:QLocalServer *localServer;QLocalSocket *clientSocket;
};// Client.h
#ifndef CLIENT_H
#define CLIENT_H#include <QObject>
#include <QLocalSocket>class Client : public QObject
{Q_OBJECT
public:explicit Client(QObject *parent = nullptr);public slots:void connected();void readyRead();private:QLocalSocket *localSocket;
};// main.cpp
#include <QCoreApplication>
#include "Server.h"
#include "Client.h"int main(int argc, char *argv[])
{QCoreApplication a(argc, argv);Server server;Client client;// 服务器监听本地连接请求QObject::connect(server.localServer, &QLocalServer::newConnection, &server, &Server::newConnection);// 客户端连接到服务器,并发送数据client.localSocket->connectToServer("myLocalServer");QObject::connect(client.localSocket, &QLocalSocket::connected, &client, &Client::connected);QObject::connect(client.localSocket, &QLocalSocket::readyRead, &client, &Client::readyRead);return a.exec();
}

这些示例只是简单演示了Qt中不同的通信机制。你可以根据具体需求和场景进行修改和扩展。请注意,这些示例中可能并未处理错误或其他异常情况,实际使用中应根据需要进行适当的错误处理和异常处理。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/4709.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

微星B460M迫击炮主板安装黑苹果

我的配置 CPU&#xff1a;Intel i5-10400 主板&#xff1a;微星 B460M 迫击炮 显卡&#xff1a;蓝宝石 5500XT 8G 无线网卡&#xff1a;BCM94360CD 一、BIOS配置 &#xff08;升级最新的BIOS XXX016&#xff09; 1.开启D.T.M &#xff08;微星主板的黑苹果模式&#xff09; 2.…

基于单片机的智能鞋柜的设计与实现

功能介绍 以51单片机作为主控系统&#xff1b;通过DHT11温湿度采集&#xff1b;通过按键设置逻辑处理&#xff1b;通过LED紫外线消毒&#xff1b;通过继电器控制风扇进行换气除湿&#xff1b;通过继电器控制加热片进行加热&#xff1b;整个电路以5v供电; 电路图 PCB 源代码 #i…

PHP中self和static的区别

今天闲来无事&#xff0c;突然有个朋友问我self和static的区别&#xff1f;那么好&#xff0c;就让我来跟大家解答一下这个问题。 self &#xff1a;它会调用当前类的方法&#xff1b;通俗来说&#xff0c;self就是写在哪个类里面, 实际调用的就是这个类的方法。 static(延迟静…

cocosCreator 3.6以上接入腾迅Bugly 捕捉JS错误 Android

cocosCreator3.6以上接入Bugly上报其实很简单&#xff0c;不需要网上那么多弯弯绕&#xff0c;三须三步走。 1. 按照官网方式接入android的bugly 2. android端写一个Bugly上报管理类 3. 修改你工程目录下native\engine\common\Classes\目录下的Game.h, Game.cpp两个文件&…

大语言模型的预训练[2]:GPT、GPT2、GPT3、GPT3.5、GPT4相关理论知识和模型实现、模型应用以及各个版本之间的区别详解

大语言模型的预训练[2]:GPT、GPT2、GPT3、GPT3.5、GPT4相关理论知识和模型实现、模型应用以及各个版本之间的区别详解 1.GPT 模型 1.1 GPT 模型简介 在自然语言处理问题中&#xff0c;可从互联网上下载大量无标注数据&#xff0c;而针对具体问题的有标注数据却非常少&#x…

【JavaEE】Tomcat的安装和使用、创建Mevan项目使用Servlet写一个程序

目录 前言 一、Tomcat的下载和安装 二、写一个简单的Servlet项目 1、创建一个Maven项目 2、引入依赖 3、创建目录 4、编写Servlet代码。 5、打包程序 6、将程序部署到Tomcat上 7、验证程序运行结果 三、在IDEA上安装Smart Tomcat插件 四、Servlet中的一些常见错误 …

基于timegan扩增技术,进行多维度数据扩增(Python编程,数据集为瓦斯浓度气体数据集)

1.数据集介绍 瓦斯是被预测气体&#xff0c;其它列为特征列,原始数据一共有472行数据&#xff0c;因为原始数据比较少&#xff0c;所以要对原始数据&#xff08;总共8列数据&#xff09;进行扩增。 开始数据截图 截止数据截图 2. 文件夹介绍 lstm.py是对未扩增的数据进行训练…

ChatGLM-6B+LangChain实战

目标&#xff1a;原始使用ChatGLM-6B可接受的文字长度有限&#xff0c;打算结合LangChain实现长文本生成摘要. 方法&#xff1a; step1&#xff1a;自定义一个GLM继承LangChain中的langchain.llms.base.LLM&#xff0c;load自己的模型. step2&#xff1a;使用LangChain的mapred…

electron globalShortcut 快捷键与系统全局快捷键冲突

用 electron 开发自己的接口测试工具&#xff08;Post Tools&#xff09;&#xff0c;在设置了 globalShortcut 快捷键后&#xff0c;发现应用中的快捷键与系统全局快捷键冲突了&#xff0c;导致系统快捷键不可正常使用。 快捷键配置 export function initGlobalShortcut(main…

MySQL数据库(一)

目录 一、MySQL安装与配置 1.1什么是数据库 1.2数据库的分类 二、MySQL服务器安装 2.1Windows绿色安装 2.2配置环境 一、MySQL安装与配置 1.1什么是数据库 存储数据用文件就可以了&#xff0c;为什么还要弄个数据库? 文件保存数据有以下几个缺点&#xff1a; 文件的安全性问…

typescript manual

这里写目录标题 throw new Error在浏览器中调试Json定义类型定义数组 functionNamed functionanonymous function Axios经典片段 错误及解决ref valuebecause it is a constantAPI 和 客户端定义的数据结构不一样ServerClient throw new Error throw new Error(“Get data err…

leetcode 1218. Longest Arithmetic Subsequence of Given Difference(给定差值的最长算术子序列)

给数组arr和一个差值difference, 不打乱arr中数字的顺序&#xff0c;抽取最长的子序列&#xff0c;使序列中每相邻两个元素的差值为difference. 求满足条件的最长子序列的长度。 思路&#xff1a; DP 因为差值difference是固定的&#xff0c;每抽取一个元素&#xff0c;它前…

Linux Kernel 4.19+内核使用GPIO模拟I2C的方法

1.修改内核配置文件&#xff0c;使内核支持GPIO模拟I2C //开启方式 make menuconfig Device Drivers ---><*> I2C support --->I2C Hardware Bus support ---> <*> GPIO-based bitbanging I2C2.对应的dts里面增加GPIO模拟I2C的设备树 注意头文件&…

【lesson2】Linux基本指令1

文章目录 touch创建文件更新文件最新修改时间 lslsls -lls -als -i pwd...cdcd 路径法一&#xff1a;cd 绝对路径法二&#xff1a;cd 相对路径 cd - stattreemkdirmkdir创建一个目录mkdir -p创建一串路径目录 ~/rmdirrmrmrm -frm -rrm -i mancpcpcp -r mvnaocatcatcat -n ta…

信息泄露与大数据:隐私安全的挑战与对策

随着大数据时代的到来&#xff0c;我们生活的方方面面都与数据息息相关。然而&#xff0c;随之而来的信息泄露问题也日益严重&#xff0c;给个人隐私和数据安全带来了巨大挑战。本文将围绕信息泄露与大数据展开讨论&#xff0c;探讨其中的问题、原因以及如何应对。 山海鲸大屏 …

常见面试题之微服务(二)

1. Spring Cloud 5大组件有哪些&#xff1f; 早期我们一般认为的Spring Cloud五大组件是&#xff1a; Eureka &#xff1a;注册中心Ribbon&#xff1a;负载均衡Feign &#xff1a;远程调用Hystrix&#xff1a;服务熔断Zuul/Gateway &#xff1a;网关 随着SpringCloudAlibba在…

16 | 视图:如何实现服务和数据在微服务各层的协作?

目录 服务的协作 1. 服务的类型 2. 服务的调用 微服务内跨层 微服务之间的服务调用 领域事件驱动 3. 服务的封装与组合 基础层 领域层 应用层 用户接口层 4. 两种分层架构的服务依赖关系 松散分层架构的服务依赖 严格分层架构的服务依赖 数据对象视图 基础层 领…

【Linux】分布式存储系统 Ceph

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 分布式存储系统 Ceph Ceph 概述1、Ceph 简介2、存储基础3、Ceph 优势4、Ceph 架构4、Ceph 核心组件5、OSD 存储后端6、Ceph 数据的存储过程7、Ceph 版本发行生命周期 Ceph 集…

向量检索增强chatglm生成

背景&#xff1a; 基于chatglm构建agnet&#xff1a;chatglm实现Agent控制 - 知乎 前面一篇文章已经介绍了如何去搭建LLM Agent控制系统&#xff0c;也简单介绍了如何去构建Toolset和构建Action。但是在上篇文章中Toolset其实是基于搜索api构建的&#xff0c;从这篇文章开始后…

MyBatis第十一讲:MyBatis事务管理机制详解

MyBatis第十一讲:MyBatis事务管理机制详解 本文是MyBatis第十一讲,主要介绍MyBatis事务管理相关的使用和机制。 文章目录 MyBatis第十一讲:MyBatis事务管理机制详解1、概述2、官网关于事务配置的内容3、事务的配置、创建和使用3.1、事务的配置3.2、事务工厂的创建3.3、事务工…