Qt--共享内存监听工具
共享内存概述
共享内存的特点:
1)共享内存是进程共享数据的一种最快的方法。
一个进程向共享内存区域写入了数据,共享这个内存区域的所有进程就可以立刻看到其中的内容。
2)使用共享内存要注意的是多个进程之间对一个给定存储区域访问的互斥。
若一个进程正在向共享内存区写数据,则在它做完这一步操作前,别的进程不应当去读写这些数据。
共享内存示意图:

共享内存是进程间通信方式中效率最高的,原因在于进程是直接在物理内存上进行操作地址映射到用户进程,所以只要对其地址进行操作,就是直接对物理地址操作。
使用共享内存实现进程间的通信的监听手段不比网络通信的监听手段多,由于开发调试需要,使用QT开发了一个小工具,启动一个新的进程软件,连接入需要监听的共享内存块,周期性读取内存中的数据并将其以固定格式写入文本文件,效果如下:

源码解析:
mainwindow.h

1 #ifndef MAINWINDOW_H
2 #define MAINWINDOW_H
3
4 #include <QMainWindow>
5 #include <QFile>
6 #include <QTextStream>
7 #include <QTextCodec>
8 #include <QDataStream>
9 #include <QDateTime>
10 #include <QTimer>
11 #include <QSharedMemory>
12 #include <QDebug>
13 #include <QMessageBox>
14
15 namespace Ui {
16 class MainWindow;
17 }
18
19 class MainWindow : public QMainWindow
20 {
21 Q_OBJECT
22
23 public:
24 explicit MainWindow(QWidget *parent = 0);
25 ~MainWindow();
26
27 private slots:
28 void on_pushButtonStart_clicked();
29
30 void on_pushButton_clicked();
31
32 private:
33 Ui::MainWindow *ui;
34
35 QTimer *mTimer;
36
37 QSharedMemory sharedMemoryWrite;
38 quint16 dataLen;
39
40 void writeToFile(const QByteArray &byteArray, const QString &fileName);
41 void writeToBin(const QByteArray &byteArray, const QString &fileName);
42 void writeToHex(const QByteArray &byteArray, const QString &fileName);
43 QString getCurrentDateTime();
44
45 public slots:
46 void readMemoryData();
47 };
48
49 #endif // MAINWINDOW_H
mainwindow.cpp
1 #include "mainwindow.h"
2 #include "ui_mainwindow.h"
3
4 MainWindow::MainWindow(QWidget *parent) :
5 QMainWindow(parent),
6 ui(new Ui::MainWindow)
7 {
8 ui->setupUi(this);
9 ui->pushButtonStart->setStyleSheet("background-color: green");
10 ui->pushButton->setStyleSheet("background-color: red");
11
12 //定时器初始化
13 mTimer = new QTimer();
14 connect(mTimer,&QTimer::timeout,this,&MainWindow::readMemoryData);
15
16 }
17
18 MainWindow::~MainWindow()
19 {
20 delete ui;
21 }
22
23 //定时器激活按钮点击事件
24 void MainWindow::on_pushButtonStart_clicked()
25 {
26 static bool state = false;
27 state = !state;
28 if(state)
29 {
30 ui->pushButtonStart->setStyleSheet("background-color: red");
31 ui->pushButtonStart->setText("Stop");
32
33 //开启读取定时
34 if(mTimer->isActive() == false)
35 {
36 mTimer->start(250);
37 }
38 }
39 else
40 {
41 ui->pushButtonStart->setStyleSheet("background-color: green");
42 ui->pushButtonStart->setText("Start");
43
44 //停止读取定时器
45 if(mTimer->isActive() == true)
46 {
47 mTimer->stop();
48 }
49 }
50 }
51
52 //包含写入时间,写入ASCII格式
53 void MainWindow::writeToFile(const QByteArray &byteArray, const QString &fileName)
54 {
55 QFile file(fileName);
56 //文件打开方式写入和追加
57 if (!file.open(QIODevice::WriteOnly | QIODevice::Append))
58 {
59 // 处理错误,例如可以抛出异常或者返回错误标志
60 return;
61 }
62 //初始化流
63 QTextStream out(&file);
64 //设置中文格式,避免乱码
65 QTextCodec *tc = QTextCodec::codecForName("GBK");
66 //QByteArray转换为QString
67 QString str = tc->toUnicode(byteArray);
68 //写入时间
69 out << getCurrentDateTime() << " " <<str;
70 //换行用于区分不同周期数据
71 out << "\n";
72 //文件关闭
73 file.close();
74 }
75
76 //十六进制转字符串写入文件
77 void MainWindow::writeToHex(const QByteArray &byteArray, const QString &fileName)
78 {
79 QFile file(fileName);
80 //文件打开方式写入和追加
81 if (!file.open(QIODevice::WriteOnly | QIODevice::Append))
82 {
83 // 处理错误,例如可以抛出异常或者返回错误标志
84 return;
85 }
86 //初始化流
87 QTextStream out(&file);
88 //设置中文格式,避免乱码
89 QTextCodec *tc = QTextCodec::codecForName("GBK");
90 //QByteArray格式转换为十六进制
91 QString str = tc->toUnicode(byteArray.toHex());
92 //QRegularExpression(“(…)”)表示匹配两个字符,replace()函数将匹配到的字符用"\1 “替换
93 out << str.replace(QRegularExpression("(..)"), "\\1 ");
94 //换行用于区分不同周期数据
95 out << "\n";
96 //文件关闭
97 file.close();
98 }
99
100 //获取当前时间
101 QString MainWindow::getCurrentDateTime()
102 {
103 // 获取当前日期和时间
104 QDateTime currentDateTime = QDateTime::currentDateTime();
105 // 将日期和时间格式化为字符串
106 // 例如: "2023-03-28 15:04:05"
107 QString dateTimeString = currentDateTime.toString("yyyy-MM-dd hh:mm:ss:zzz");
108
109 return dateTimeString;
110 }
111
112 //读取内存定时器
113 void MainWindow::readMemoryData()
114 {
115 QByteArray dataRead;
116 //初始化dataRead缓存的大小
117 dataRead.resize(dataLen);
118
119 //锁闭内存
120 sharedMemoryWrite.lock();
121 //拷贝内存中的数据到dataRead缓存中
122 memcpy(dataRead.data(),(char*)sharedMemoryWrite.data(),dataRead.length());
123 //释放内存
124 sharedMemoryWrite.unlock();
125
126 //记录内存中数据到文件
127 QByteArray byteArray = ":";
128 //设置记录文件名称
129 QString fileName = "output.txt";
130 //将当前时间数据写入到文件中
131 writeToFile(byteArray, fileName);
132 //将拷贝出来的内存数据写入到文件中
133 writeToHex(dataRead, fileName);
134 }
135
136 //连接共享内存事件
137 void MainWindow::on_pushButton_clicked()
138 {
139 static bool state = false;
140
141 if(state)
142 {
143 //共享内存分离
144 sharedMemoryWrite.detach();
145 ui->pushButton->setStyleSheet("background-color: red");
146 ui->pushButton->setText("DisConnect");
147 state = !state;
148 }
149 else
150 {
151 sharedMemoryWrite.setKey(ui->lineEdit->text());
152 sharedMemoryWrite.detach();//分离
153 bool flag = sharedMemoryWrite.attach();//连接
154 if(!flag)
155 {
156 //内存不存在
157 qDebug()<<ui->lineEdit->text()<<" is not alive";
158 //设置中文格式,避免乱码
159 QTextCodec *tc = QTextCodec::codecForName("GBK");
160 //转换成中文GBK格式
161 QString str = tc->toUnicode("内存不存在,\n请确认内存名称");
162 //弹窗告警
163 QMessageBox::warning(this,"Warning",str);
164 return;
165 }
166 dataLen = sharedMemoryWrite.size();
167 qDebug()<<"Connect "<<ui->lineEdit->text();
168
169 ui->pushButton->setStyleSheet("background-color: green");
170 ui->pushButton->setText("Connect");
171 state = !state;
172 }
173
174 }
源码下载:
链接: https://pan.baidu.com/s/19-0WgDwdJpGB0A3L87-cBw 提取码: q9cc 复制这段内容后打开百度网盘手机App,操作更方便哦
Qt--共享内存监听工具的更多相关文章
- Charles_N:HTTP请求响应监听工具
Charles:HTTP请求响应监听工具使用说明.doc 1. 介绍 Charles是一个HTTP代理服务器,HTTP监视器,反转代理服务器.它允许一个开发者查看所有连接互联网的HTTP通信 ...
- Qt 子窗口监听主窗口信号
Qt 子窗口监听主窗口信号(转载) 原文链接:https://www.cnblogs.com/ybqjymy/p/12169762.html 1 MainWindow *ptr = NULL; 2 ...
- 了解linux web的监听工具
zabbix cacti Nagios 本想安装的,但是安装需要一个 空的服务器,因为服务器已经有安装 LAMP,故没有去了解 尝试了 cacti ,因为本地环境版本问题,只能使用0.8.8a版本,并 ...
- qt 共享内存 单例
QT 进程间通信之古老的方法(内存共享) 让QT只运行一个实例 以上两篇文章中分别讲述了QSharedMemory的不同作用,第一篇讲了进程间通信,第二篇讲述了怎么让应用程序只 ...
- 拉仇恨!webhook + 企业微信给同事做了个代码提交监听工具
本文案例收录在 https://github.com/chengxy-nds/Springboot-Notebook 大家好,我是小富~ 最近接个任务,用webhook做了个代码提交监听功能,就是有人 ...
- qt 共享内存(QSharedMemory)
——————————————————写入部分—————————————————— (本次程序基于控制台程序) 首先 使用共享内存得召唤一下: #include <QSharedMemory> ...
- 网络监听工具 嗅探器 SpyNet
配置网卡 注册 监听配置 开始捕获
- http监听工具Fildder
空间管理您的位置: 51Testing软件测试网 » 雨洒泪 » 日志 中国龙,中国风,中国会变得更加强大! 力量越大,责任越大! 人的一生,会面临很多选择,但决定一个人一生的,往往就是最关键那么的一 ...
- webServices学习四(---WebService监听工具)
之前我们使用过HttpWatch获取的HTTP的调用过程,并获得了HTTP的请求头及其他请求的详细信息. 既然WebServie也是通过HTTP进行通信的,能不使用HTTPWatch来获取它的请求过程 ...
- QT 子窗口监听主窗口信号(超级简单,但是好用,比如主窗口移动的时候,子窗口不要再继续处理任务)
MainWindow *ptr = NULL; ptr = (MainWindow*)parentWidget(); connect(ptr, SIGNAL(param_result(bool)), ...
随机推荐
- SpringBoot模拟插入1000000万条数据
一.数据库表准备 CREATE TABLE `student` ( `id` bigint NOT NULL COMMENT '用户id', `name` varchar(50) COLLATE ut ...
- H5页面制作和CSS3动画的结合
现在很火的是h5页面的开发,更多的视觉冲击,带来更多的关注度,更多的眼球,想要别人看你的东西,不在是以前的一段文字,或是一个图片的时代了,现在h5把一张张图片,一段段文字动起来,更有与客户的交互,而且 ...
- HJ212-2017协议数据采集和接收
1.客户端TCP和UDP的数据发送工具 工具和软件下载页面如下:http://www.zlmcu.com/document/tcp_debug_tools.html 2.服务端数据接收监控软件 IPA ...
- VS Code侧边栏的“资源管理器”丢了
选择"查看"下的"命令面板" 输入:View: Reset View Locations 所有的视图会恢复到默认的位置.
- Flutter(八):Flutter路由管理(Router)
目录 一.术语 路由(route): 导航(Navigator): 二.路由管理 1.Navigator示例代码 2.路由定义(命名路由) 在App中定义router: 3.Navigator方法介绍 ...
- 分享一个关于Avl树的迭代器算法
1 研究过程 前段时间在研究avl树的迭代实现,在节点不使用parent指针的情况下,如何使用堆栈来实现双向地迭代.我参考了网络上的大部分迭代器实现,要么是使用了parent指针(就像c++的map容 ...
- 007. gitlab仓库管理
1. gitlab创建组 创建后: 组管理: 组创建完成后,开始创建用户 2. gtilab创建用户 这里无法直接创建密码,需要创建用户后在对用户进行操作修改密码 密码和权限设置,取消和开启创建组权限 ...
- Nacos 源码环境搭建
最近在学习nacos,通过调式源码查看服务注册和发现流程和原理,本地部署naos源码需要一定的步骤,本文主要做nacos源码部署. nacos版本:2.1.1 下载源码 从github上下载源码到本地 ...
- 在webpack中运行vue
网址:https://vue-loader.vuejs.org/zh/ Vue Loader 是一个 webpack 的 loader,它允许你以一种名为单文件组件的格式撰写 Vue 组件 安装loa ...
- xtrabackup备份工具
为什么要学这个工具 背景 一个合格的运维工程师或者dba工程师,如果有从事数据库方面的话,首先需要做的就是备份,如果没有备份,出现问题的话,你的业务就会出问题,你的工作甚至会... 所以备份是重要的, ...