一、现实需求:
项目中有一个FPGA需要实时高速大数据量采集投影数据,需要将驱动单独编写成一个进程,并将文件地址及时共享给另外一个应用程序进程。
以前测试过将两个程序放在一个进程里,多线程运行。但是有应用程序处理过慢,循环队列会溢出的问题。而且多次编译程序,多次打开驱动会导致硬件停止工作。
二、软件需求:
1、写进程,创建共享内存,不断的往共享内存中写文件地址。
2、读进程,打开共享内存,不断的从共享内存中读文件地址。
三、前提知识储备:
1、QSystemSemaphore
2、QSharedMemory
四、代码测试例子:
代码下载:Qt共享内存代码例子.rar
1、首先是写进程的程序。
WriteSharedMemory.h文件
Cpp代码
- #ifndef WRITESHAREDMEMORY_H
- #define WRITESHAREDMEMORY_H
- #include <QtGui/QMainWindow>
- #include "ui_WriteSharedMemory.h"
- #include <QSharedMemory>
- #include <QSystemSemaphore>
- class WriteSharedMemory : public QMainWindow
- {
- Q_OBJECT
- public:
- WriteSharedMemory(QWidget *parent = 0, Qt::WFlags flags = 0);
- ~WriteSharedMemory();
- ///可用空间
- static QSystemSemaphore freeSystemSem;
- ///已用空间
- static QSystemSemaphore usedSystemSem;
- public slots:
- ///写入共享内存
- void loadIntoSharedMem();
- void init();
- void write();
- QString read();
- ///循环写
- void run();
- void detach();
- private:
- Ui::WriteSharedMemoryClass ui;
- QSharedMemory sharedMem;
- int num;
- };
- #endif // WRITESHAREDMEMORY_H
WriteSharedMemory.cpp文件
Cpp代码
- #include "WriteSharedMemory.h"
- #include <QBuffer>
- #include <QDebug>
- WriteSharedMemory::WriteSharedMemory(QWidget *parent, Qt::WFlags flags)
- : QMainWindow(parent, flags),sharedMem("MySharedMemory")
- {
- ui.setupUi(this);
- num = 0;
- init();
- //connect(ui.loadButton, SIGNAL(clicked()), SLOT(loadIntoSharedMem()));
- connect(ui.loadButton, SIGNAL(clicked()), SLOT(run()));
- connect(ui.initBtn, SIGNAL(clicked()), SLOT(init()));
- connect(ui.detachBtn, SIGNAL(clicked()), SLOT(detach()));
- }
- WriteSharedMemory::~WriteSharedMemory()
- {
- }
- QSystemSemaphore WriteSharedMemory::freeSystemSem("freeFpga", 3, QSystemSemaphore::Create);
- QSystemSemaphore WriteSharedMemory::usedSystemSem("usedFpga", 3, QSystemSemaphore::Create);
- void WriteSharedMemory::init()
- {
- // First, test whether a shared memory segment is already attached to the process.
- // If so, detach it
- if (sharedMem.isAttached())
- {
- if(!sharedMem.detach())
- {
- ui.textEdit->append("WriteSharedMemory : detach failed.");
- qDebug()<< "WriteSharedMemory : detach failed.";
- return;
- }
- }
- if ( !sharedMem.create( 1024 ) )
- {
- ui.textEdit->append(tr("Unable to create shared memory segment."));
- qDebug()<< "WriteSharedMemory::Unable to create shared memory segment.";
- return;
- }
- }
- void WriteSharedMemory::loadIntoSharedMem()
- {
- write();
- }
- void WriteSharedMemory::run()
- {
- while(1)
- {
- loadIntoSharedMem();
- _sleep(2);
- }
- }
- QString WriteSharedMemory::read()
- {
- QBuffer buffer;
- QDataStream in(&buffer);
- QString text;
- sharedMem.lock();
- buffer.setData((char*)sharedMem.constData(), sharedMem.size());
- buffer.open(QBuffer::ReadOnly);
- in >> text;
- sharedMem.unlock();
- qDebug() << "WriteSharedMemory:: Read:" << text;
- return text;
- }
- void WriteSharedMemory::write( )
- {
- QString text = read();
- QBuffer buffer;
- text = text + "C://project//projectFile" + QString::number(num) + ".txt;";
- buffer.open( QBuffer::ReadWrite );
- QDataStream out( &buffer );
- out << text;
- int size = buffer.size();
- if(sharedMem.size()<size)
- {
- qDebug() << "共享内存空间不够!";
- return ;
- }
- num++;
- freeSystemSem.acquire();
- // Write into the shared memory
- sharedMem.lock();
- char *to = (char*)sharedMem.data();
- const char *from = buffer.data().data();
- memcpy( to, from, qMin( sharedMem.size(), size ) );
- sharedMem.unlock();
- usedSystemSem.release();
- ui.textEdit_2->append(text);
- qDebug() << "WriteSharedMemory:: Write:" << text;
- }
- void WriteSharedMemory::detach( )
- {
- if (sharedMem.isAttached())
- {
- qDebug() << "attached";
- if(!sharedMem.detach())
- ui.textEdit->append("WriteSharedMemory:: detach failed.");
- else
- qDebug() << "WriteSharedMemory:: detached success.";
- }
- }
ReadSharedMemory.h文件
Cpp代码
- #ifndef READSHAREDMEMORY_H
- #define READSHAREDMEMORY_H
- #include <QtGui/QMainWindow>
- #include "ui_ReadSharedMemory.h"
- #include <QSharedMemory>
- #include <QSystemSemaphore>
- class ReadSharedMemory : public QMainWindow
- {
- Q_OBJECT
- public:
- ReadSharedMemory(QWidget *parent = 0, Qt::WFlags flags = 0);
- ~ReadSharedMemory();
- ///可用空间
- static QSystemSemaphore freeSystemSem;
- ///已用空间
- static QSystemSemaphore usedSystemSem;
- public slots:
- ///读取共享内存
- void loadFromSharedMem();
- void read();
- ///循环读
- void run();
- void detach();
- void attach();
- private:
- Ui::ReadSharedMemoryClass ui;
- QSharedMemory sharedMem;
- };
- #endif // READSHAREDMEMORY_H
ReadSharedMemory.cpp文件
Cpp代码
- #include "ReadSharedMemory.h"
- #include <QBuffer>
- #include <QDataStream>
- #include <QDebug>
- ReadSharedMemory::ReadSharedMemory(QWidget *parent, Qt::WFlags flags)
- : QMainWindow(parent, flags),sharedMem("MySharedMemory")
- {
- ui.setupUi(this);
- connect(ui.showButton, SIGNAL(clicked()), SLOT(run()));
- connect(ui.detachBtn, SIGNAL(clicked()), SLOT(detach()));
- connect(ui.attachBtn, SIGNAL(clicked()), SLOT(attach()));
- }
- ReadSharedMemory::~ReadSharedMemory()
- {
- }
- QSystemSemaphore ReadSharedMemory::freeSystemSem("freeFpga", 3, QSystemSemaphore::Open);
- QSystemSemaphore ReadSharedMemory::usedSystemSem("usedFpga", 3, QSystemSemaphore::Open);
- void ReadSharedMemory::read()
- {
- if(sharedMem.isAttached())
- {
- //qDebug() << "ReadSharedMemory:: haved attached.";
- }
- else
- {
- if(!sharedMem.attach())
- {
- //If an attempt of reading from the shared memory before data is written
- QSharedMemory::SharedMemoryError m = sharedMem.error();
- qDebug() << "ReadSharedMemory:: attach failed.";
- return;
- }
- else
- {
- qDebug() << "ReadSharedMemory:: attach success.";
- }
- }
- QBuffer buffer;
- QDataStream in(&buffer);
- QString text;
- usedSystemSem.acquire();
- sharedMem.lock();
- buffer.setData((char*)sharedMem.constData(), sharedMem.size());
- buffer.open(QBuffer::ReadOnly);
- in >> text;
- //清空缓存
- char* to = (char*)sharedMem.data();
- memset(to,0,sharedMem.size());
- sharedMem.unlock();
- freeSystemSem.release();
- // As this is the last process attached to the shared memory segment
- // the shared memory segment is released, destroying its contents
- //sharedMem.detach();
- ui.textEdit_2->append(text);
- QStringList fileList = text.split(";");
- QStringList::const_iterator constIterator;
- for (constIterator = fileList.constBegin(); constIterator < fileList.constEnd()-1;
- ++constIterator)
- qDebug() <<"ReadSharedMemory:: Read:"<< (*constIterator).toLocal8Bit().constData();
- }
- void ReadSharedMemory::loadFromSharedMem()
- {
- read();
- }
- void ReadSharedMemory::run()
- {
- while(1)
- {
- loadFromSharedMem();
- }
- }
- void ReadSharedMemory::detach( )
- {
- if (sharedMem.isAttached())
- {
- qDebug() << "attached";
- if(!sharedMem.detach())
- qDebug() << "ReadSharedMemory::detached failed.";
- else
- qDebug() << "ReadSharedMemory::detached success.";
- }
- }
- void ReadSharedMemory::attach()
- {
- if(sharedMem.isAttached())
- ui.textEdit->append(tr("ReadSharedMemory:: sharedMem is attched by this process."));
- if (!sharedMem.attach())
- {
- //If an attempt of reading from the shared memory before data is written
- QSharedMemory::SharedMemoryError m = sharedMem.error();
- qDebug() << "ReadSharedMemory:: attach failed.";
- }
- else
- {
- qDebug() << "ReadSharedMemory:: attach success.";
- }
- }