共享内存概述

共享内存的特点:

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--共享内存监听工具的更多相关文章

  1. Charles_N:HTTP请求响应监听工具

    Charles:HTTP请求响应监听工具使用说明.doc   1.    介绍 Charles是一个HTTP代理服务器,HTTP监视器,反转代理服务器.它允许一个开发者查看所有连接互联网的HTTP通信 ...

  2. Qt 子窗口监听主窗口信号

    Qt 子窗口监听主窗口信号(转载)  原文链接:https://www.cnblogs.com/ybqjymy/p/12169762.html 1 MainWindow *ptr = NULL; 2 ...

  3. 了解linux web的监听工具

    zabbix cacti Nagios 本想安装的,但是安装需要一个 空的服务器,因为服务器已经有安装 LAMP,故没有去了解 尝试了 cacti ,因为本地环境版本问题,只能使用0.8.8a版本,并 ...

  4. qt 共享内存 单例

        QT 进程间通信之古老的方法(内存共享)     让QT只运行一个实例     以上两篇文章中分别讲述了QSharedMemory的不同作用,第一篇讲了进程间通信,第二篇讲述了怎么让应用程序只 ...

  5. 拉仇恨!webhook + 企业微信给同事做了个代码提交监听工具

    本文案例收录在 https://github.com/chengxy-nds/Springboot-Notebook 大家好,我是小富~ 最近接个任务,用webhook做了个代码提交监听功能,就是有人 ...

  6. qt 共享内存(QSharedMemory)

    ——————————————————写入部分—————————————————— (本次程序基于控制台程序) 首先 使用共享内存得召唤一下: #include <QSharedMemory> ...

  7. 网络监听工具 嗅探器 SpyNet

    配置网卡 注册 监听配置 开始捕获

  8. http监听工具Fildder

    空间管理您的位置: 51Testing软件测试网 » 雨洒泪 » 日志 中国龙,中国风,中国会变得更加强大! 力量越大,责任越大! 人的一生,会面临很多选择,但决定一个人一生的,往往就是最关键那么的一 ...

  9. webServices学习四(---WebService监听工具)

    之前我们使用过HttpWatch获取的HTTP的调用过程,并获得了HTTP的请求头及其他请求的详细信息. 既然WebServie也是通过HTTP进行通信的,能不使用HTTPWatch来获取它的请求过程 ...

  10. QT 子窗口监听主窗口信号(超级简单,但是好用,比如主窗口移动的时候,子窗口不要再继续处理任务)

    MainWindow *ptr = NULL; ptr = (MainWindow*)parentWidget(); connect(ptr, SIGNAL(param_result(bool)), ...

随机推荐

  1. Surge DHCP设置

    关于DNS配置 对于中国用户,推荐的 DNS 配置如下: 如果经常使用的网络没有 DNS 劫持问题:配置为使用系统 DNS 配置并追加 223.5.5.5 和 114.114.114.114 作为冗余 ...

  2. deepin下的系统,如何为root用户添加密码

  3. SQL函数详解SUM\COUNT\AVG......

    朋友们,个人公众号:SQL数据库运维 移动端的学习分享,各种数据库基础知识,一起进步,共同学习,期待你的加入. 函数的类型 1.聚合函数:对一组值执行计算,并返回单个值,也被称为组函数.聚合函数经常与 ...

  4. RemoteView 替代品和类似软件

    RemoteView 是一款远程控制软件,使您可以通过Internet连接远程访问计算机和移动设备,而不受时间和地点的限制. 您可以快速,安全地实时轻松地控制计算机和移动设备. 您可以使用我们的iOS ...

  5. 策略梯度玩 cartpole 游戏,强化学习代替PID算法控制平衡杆

    cartpole游戏,车上顶着一个自由摆动的杆子,实现杆子的平衡,杆子每次倒向一端车就开始移动让杆子保持动态直立的状态,策略函数使用一个两层的简单神经网络,输入状态有4个,车位置,车速度,杆角度,杆速 ...

  6. 在 ThinkPad E470 上安装 Ubuntu 16.04 无线网卡驱动

    目录 文章目录 目录 安装 安装 # 查看无线网卡驱动类型,E470 一般为 RTL8821CE lspci # 安装必要工具 sudo apt-get install build-essential ...

  7. swagger文档枚举类型描述

    背景: 问题:使用swagger作为api文档,但文档中的枚举类型仅显示枚举name,对于使用文档的人员来讲不容易理解 解决思路:枚举类型加上自定义的描述 解决方案 maven配置 <depen ...

  8. java学习之旅(day.19)

    多线程 线程简介 多任务:同时做多件事 进程(Process):在操作系统中运行的程序就是进程,如QQ,播放器,游戏. 线程(Thread):一个进程可以有多个线程,如视频中同时听声音,看弹幕,看图像 ...

  9. 安全高效 | AIRIOT智慧工地管理解决方案

      建筑工地施工材料.机械设备.工程车.人员各个环节管理相对复杂.建筑业也是安全事故频发的高危行业,安全管控尤为重要.建筑施工单位想要保障安全生产,做好能源消耗管控降低生产成本,需要解决掉很多现状问题 ...

  10. c# - 如何在圆角 WPF 窗体中创建圆角矩形?

    我正在 WPF 中创建一个应用程序,我想要圆角.收到.现在窗体是无边框的,我正在尝试创建一个圆角矩形并将其放在顶部,使其看起来像 Windows 应用程序的顶部栏. 我做不到. 这是我的代码: < ...