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)), ...
随机推荐
- 网络协议分析与抓包 TCP/IP UDP等
学习地址: https://www.bilibili.com/video/BV1hV411U74y?p=4 https://www.bilibili.com/video/BV1S7411R7kF?p= ...
- 如何在 Ubuntu 服务器上安装桌面环境 (GUI)
先以VNC方式远程登录服务器 执行命令 sudo apt update && sudo apt upgrade # 选择1---使用tasksel安装 sudo apt install ...
- AI回答总不满意?你的提问方式可能完全错误!
AI回答总不满意?你的提问方式可能完全错误! 大家好,我是卷福同学,一个专注AI大模型整活的前阿里程序员,腾讯云社区2023新秀突破作者 向AI提问想写一篇论文,结果AI就生成2000字左右的文章后就 ...
- Chart.js (v2.9.4)--如何像高版本一样支持skipNull
项目开发中,用到Chart.js展示图表,用起来也非常方便,配置很灵活,很好用,给个数据集,设置一些配置值,实例化一个Chart出来,图表就非常丝滑地展现出来了. 但是作为开发人员都知道的一个真理,永 ...
- C# 数独 解法
按照人的思维来做的. MyPos 就是 数组 行 列值. public class CalcShuDu { public int[][] IArrSd; public int IBlankCount; ...
- 彻底搞清楚vue3的defineExpose宏函数是如何暴露方法给父组件使用
前言 众所周知,当子组件使用setup后,父组件就不能像vue2那样直接就可以访问子组件内的属性和方法.这个时候就需要在子组件内使用defineExpose宏函数来指定想要暴露出去的属性和方法.这篇文 ...
- Linux命令行优化,历史记录优化
#命令行优化: echo "export PS1='\[\033[01;31m\]\u\[\033[00m\]@\[\033[01;32m\]\h\[\033[00m\][\[\033[01 ...
- 发现了一个膨胀样式的css库
众所周知,对于前端来说css是最难的了,如果你遇到了一个脑洞大奇思妙想的产品,那就更难了. 很不巧,了不起就经受过这样的痛苦,产品经理看了HarmonyOS4的发布会,脑子一热就让设计师出了一套膨胀蓬 ...
- 8.18考试总结(NOIP模拟43)[第一题·第二题·第三题·第四题]
愿你和重要的人,在来日重逢. 前言 题目名字起的很随意... 这天 Luogu 的运势好像是大凶(忌:打模拟赛,注意报零). 但是考得还不错,拿到了这么多场模拟赛以来第二三个场上AC. 所以说,我爱大 ...
- Apisix网关-使用Grafana可视化Apisix的Prometheus数据
Apisix安装部署 Apisix官网安装教程 Apisix Dashboard官网安装教程 本次教程使用RPM包安装方式 使用systemctl管理服务 Apisix配置要点 /usr/local/ ...