关于共享内存的问题 QShareMemory
//.h文件
#ifndef DIALOG_H
#define DIALOG_H
#include <QDialog>
#include <QSharedMemory>
namespace Ui {
class Dialog;
}
class Dialog : public QDialog
{
Q_OBJECT
public:
explicit Dialog(QWidget *parent = 0);
~Dialog();
private:
Ui::Dialog *ui;
QSharedMemory shareMemory;
void detach();
private slots:
void loadFromFile();
void loadFromMemory();
void on_pushButton_clicked();
void on_pushButton_2_clicked();
};
#endif // DIALOG_H
//.cpp文件
#include "dialog.h"
#include "ui_dialog.h"
#include <QFileDialog>
#include <QBuffer>
#include <QDebug>
Dialog::Dialog(QWidget *parent) :
QDialog(parent),
ui(new Ui::Dialog)
{
ui->setupUi(this);
//在使用共享内存以前,需要先为其指定一个key,系统用它来作为底层共享内存段
//的标识。这个Key可以指定为任意的字符串。
shareMemory.setKey("QShareMemoryExample");
}
Dialog::~Dialog()
{
delete ui;
}
void Dialog::detach()
{
if(!shareMemory.detach()){
ui->label->setText(tr("无法从共享内存中分离"));
}
}
void Dialog::loadFromFile()
{
//判断该进程是否已经连接到共享内存段
if(shareMemory.isAttached())
detach(); //先将该进程与共享内存段进行分离
ui->label->setText(tr("选择一个图片文件!"));
QString fileName = QFileDialog::getOpenFileName(0,QString(),QString(),
tr("Images(*.png *.jpg)"));
QImage image;
if(!image.load(fileName)){
ui->label->setText(tr("选择的文件不是图片,请选择图片文件"));
return;
}
ui->label->setPixmap(QPixmap::fromImage(image));
//将图片加载到共享内存,使用QBuffer来暂存图片
QBuffer buffer;
buffer.open(QBuffer::ReadWrite);
QDataStream out(&buffer);
out<<image;
int size = buffer.size();
//创建指定大小的共享内存段,其大小是字节,该函数还会自动将共享内存段连接到本进程上
if(!shareMemory.create(size)){
ui->label->setText(tr("无法创建共享内存段"));
return;
}
//测试
if(shareMemory.isAttached()) qDebug()<<"haha";
shareMemory.lock(); //在进行共享内存段的操作期间,必须先进行加锁
//等操作完成后,调用unlock()来进行解锁
//这样在同一时间,就只能有一个进程允许操作共享内存段
//如果将最后一个连接在共享内存段上的进程进行分离,那么系统就会释放该共享内存段
//因为现在只有一个进程在共享内存段上,所以不能将它们进行分离
char* to = (char*)shareMemory.data();
const char* from = buffer.data().data();
memcpy(to,from,qMin(shareMemory.size(),size));
shareMemory.unlock();//进行解锁
}
void Dialog::loadFromMemory()
{
if(shareMemory.isAttached()) qDebug()<<"haha";
//将进程连接到共享内存段
if(!shareMemory.attach()){
ui->label->setText(tr("无法连接到共享内存段,\n"
"请先加载一张图片!"));
qDebug()<< shareMemory.errorString();
return;
}
QBuffer buffer;
QDataStream in(&buffer);
QImage image;
shareMemory.lock();
buffer.setData((char*)shareMemory.constData(),shareMemory.size());
buffer.open(QBuffer::ReadOnly);
in>>image;
shareMemory.unlock();
shareMemory.detach();
ui->label->setPixmap(QPixmap::fromImage(image));
}
void Dialog::on_pushButton_clicked()
{
loadFromFile();
}
void Dialog::on_pushButton_2_clicked()
{
loadFromMemory();
}
这里有一个问题不是很理解,我测试时,开启了一个窗口,也是一个进程,这里称线程1,然后从文件加载了一张图片,这个时候再从共享内存中显示图片,结果就是下面的无法连接的结果,如下个代码
//无法连接的代码段
if(shareMemory.isattached()) qDebug()<<"haha";
if(!shareMemory.attach()){
ui->label->setText(tr("无法连接到共享内存段,\n"
"请先加载一张图片!"));
qDebug()<< shareMemory.errorString();
return;
}然后再开一个新的进程,这里称线程2,这个时候可以从共享内存中显示图片
从上图的代码看,我使用了QShareMemory::isAttached()测试得知此时线程1是有与共享内存连接的,
但是接下去的
f(!shareMemory.attach())
却返回了true,也就是连接失败,这是为什么呢?
请各位大大们帮我解释一下,谢谢!

相关推荐
Qt QShareMemory lz4 Quazip
Qt QShareMemory lz4 Quazip 进程通信,共享内存,读写内存,快速压缩;
qt线程间理解共享内存QShareMemory
qt线程间的通信有其特有的信号与槽,也可通过共享内存的方式实现,下面演示如何使用QShareMemory实现线程间的共享内存;这里使用为简单的理解QShareMemory,并没有实现消费者和生产者的逻辑。 ###生产者端程序 ####头文件 #ifndef PRODUCERTHREAD_H #define PRODUCERTHREAD_H /** * @file producer...
QShareMemory示例.zip
Qt使用QShareMemory内存共享示例,注释清晰,流程简单。分为读写2个进程,写进程负责把图片写入内存,读进程把图片读出并显示。
【Qt】进程间通信之QSharedMemory程序.rar
【Qt】进程间通信之QSharedMemory程序示例,包括读端和写端。
微电网中蓄电池与超级电容混合储能的协调控制(Simulink仿真实现)
内容概要:本文系统研究了微电网中蓄电池与超级电容混合储能系统的协调控制策略,并基于Simulink平台完成了仿真验证。文章围绕两类储能元件的特性差异,提出通过合理的能量管理策略与功率分配算法实现优势互补:利用蓄电池的高能量密度承担长期能量支撑,结合超级电容的高功率密度应对瞬时功率波动,从而有效平抑微电网中的功率不平衡问题,提升系统动态响应速度与运行稳定性。文中构建了包含多级控制架构的混合储能系统模型,采用低通滤波、改进下垂控制或状态反馈控制等方法实现功率的频率分量解耦与动态分配,详细阐述了控制环路设计、能量管理逻辑及参数整定原则。仿真结果表明,该协调控制策略能显著降低单一储能单元的负荷压力,延长其使用寿命,并增强微电网在并网与孤岛模式下的电能质量与供电可靠性。; 适合人群:具备电力系统分析、自动控制理论及新能源技术基础知识,熟悉MATLAB/Simulink仿真环境,从事微电网、分布式能源系统、储能技术等相关领域研究的研究生、高校科研人员及电力行业工程技术人员。; 使用场景及目标:①深入理解混合储能系统在微电网功率平衡、频率调节与电压稳定中的协同作用机制;②掌握基于频率分解或下垂特性的功率分配算法设计与实现方法;③为储能系统寿命优化、动态性能提升提供可复现的仿真验证平台;④支持学术论文研究、毕业课题开发及实际工程项目前期方案论证与优化。; 阅读建议:建议读者结合文中提供的仿真模型与参考文献,亲手搭建Simulink系统,重点剖析功率分配逻辑与多层控制结构的协同机制,深入理解控制参数对系统动态性能的影响,并可通过设置不同的负载扰动工况或引入可再生能源出力波动来测试系统的鲁棒性与适应性。


