#include "mainwindow.h"
#include "ui_mainwindow.h"
//注意:读取方打开方式为Open
QSystemSemaphore MainWindow::s_freeSystemSem("freeSemaphore", 1, QSystemSemaphore::Open);
QSystemSemaphore MainWindow::s_usedSystemSem("usedSemaphore", 1, QSystemSemaphore::Open);
MainWindow::MainWindow(QWidget *parent) :
QMainWindow(parent),
ui(new Ui::MainWindow)
{
ui->setupUi(this);
this->setWindowTitle("Read ShareMemory");
connect(this,SIGNAL(sigExit()),this,SLOT(slotExit()));
connect(this,SIGNAL(sigRecvData(QString)),this,SLOT(slotRecvData(QString)));
initShareMem();
m_pCReadThread = new CShareMemReadThread(this);
m_pCReadThread->start();
}
MainWindow::~MainWindow()
{
delete ui;
detachShareMem();
}
void MainWindow::slotExit()
{
qApp->exit();
}
void MainWindow::slotRecvData(QString data)
{
if(0 == data.compare(tr("app exit")))
{
qApp->exit();
return;
}
ui->textBrowser->append(data);
}
void MainWindow::notifyRecvData()
{
emit sigRecvData(tr(m_recvBuf));
}
void MainWindow::notifyExit()
{
emit sigExit();
}
/************************************************************
功能:初始化共享内存
参数:
返回:>=0,成功;
<0,失败
作者:刘远安 2015-06-23
************************************************************/
int MainWindow::initShareMem()
{
int ret = -1;
m_sharedMem.setKey("FrontCommunicationSharedMemory");
if (m_sharedMem.isAttached())
{
if(!m_sharedMem.detach())
{
qWarning("WriteSharedMemory : detach failed.");
return ret;
}
}
else
{
qWarning("ReadSharedMemory:: attach success.");
}
return 0;
}
/************************************************************
功能:释放共享内存
参数:
返回:>=0,成功;
<0,失败
作者:刘远安 2015-06-23
************************************************************/
int MainWindow::detachShareMem()
{
int ret = -1;
if (m_sharedMem.isAttached())
{
qWarning("ShareMem is attached");
if(!m_sharedMem.detach())
{
qWarning("WriteSharedMemory:: detach failed.");
return ret;
}
else
{
qWarning("WriteSharedMemory:: detached success.");
}
}
return 0;
}
/************************************************************
功能:读取共享内存数据
参数:
返回:>=0,成功;
<0,失败
作者:刘远安 2015-06-23
************************************************************/
int MainWindow::readShareMem()
{
int ret = -1;
if(m_sharedMem.isAttached())
{
qWarning("ReadSharedMemory:: haved attached.");
}
else
{
if(!m_sharedMem.attach())
{
//If an attempt of reading from the shared memory before data is written
QSharedMemory::SharedMemoryError m = m_sharedMem.error();
qWarning("ReadSharedMemory:: attach failed.");
return ret;
}
else
{
qWarning("ReadSharedMemory:: attach success.");
}
}
s_usedSystemSem.acquire();
m_sharedMem.lock();
char *buf = (char*)m_sharedMem.constData();
m_recvLen = strlen(buf);
if(m_recvLen > 0)
{
memset(m_recvBuf,0,sizeof(m_recvBuf));
memcpy(m_recvBuf,buf,m_recvLen);
}
//清空缓存
buf = (char*)m_sharedMem.data();
memset(buf,0,m_sharedMem.size());
m_sharedMem.unlock();
s_freeSystemSem.release();
return m_recvLen;
}
CShareMemReadThread::CShareMemReadThread(MainWindow *pMainWindow)
{
m_pMainWindow = pMainWindow;
}
CShareMemReadThread::~CShareMemReadThread()
{
}
void CShareMemReadThread::run()
{
while (1)
{
int readLen = m_pMainWindow->readShareMem();
qWarning("readLen=%d",readLen);
if(readLen > 0)
{
m_pMainWindow->notifyRecvData();
}
msleep(100);
}
return;
}
QSharedMemory使用例子
5星 · 超过95%的资源 需积分: 48 126 浏览量
2015-06-25
20:57:57
上传
评论
收藏 11KB ZIP 举报
liuguangzhou123
- 粉丝: 67
- 资源: 131
最新资源
- 最通俗易懂的 MongoDB 非结构化文档存储数据库教程.zip
- 以mongodb为数据库的订单物流小项目.zip
- 腾讯云-mongodb数据库, 项目部署.zip
- 腾讯 APIJSON 的 MongoDB 数据库插件.zip
- 理解非关系型数据库和关系型数据库的区别.zip
- 操作简单的Mongodb网页web管理工具,基于Spring Boot2.0支持mongodb集群.zip
- tms-mongodb-web,提供访问mongodb数据的REST API和可灵活扩展的mongodb web 客户端.zip
- SpringBoot整合mongodb学习MongoTemplate和MongoRepository两种方式CRUD使用.zip
- SpringBoot整合MongoDB实现对数据库的CRUD小demo.zip
- Python操作MongoDB数据库的基本一些操作 .zip
资源上传下载、课程学习等过程中有任何疑问或建议,欢迎提出宝贵意见哦~我们会及时处理!
点击此处反馈