Qt进程间共享内存例子

一、现实需求:

项目中有一个FPGA需要实时高速大数据量采集投影数据,需要将驱动单独编写成一个进程,并将文件地址及时共享给另外一个应用程序进程。

以前测试过将两个程序放在一个进程里,多线程运行。但是有应用程序处理过慢,循环队列会溢出的问题。而且多次编译程序,多次打开驱动会导致硬件停止工作。

二、软件需求:

1、写进程,创建共享内存,不断的往共享内存中写文件地址。

2、读进程,打开共享内存,不断的从共享内存中读文件地址。

三、前提知识储备:

1、QSystemSemaphore

2、QSharedMemory

四、代码测试例子:

代码下载:Qt共享内存代码例子.rar

1、首先是写进程的程序。

WriteSharedMemory.h文件

Cpp代码 
  1. #ifndef WRITESHAREDMEMORY_H  
  2. #define WRITESHAREDMEMORY_H  
  3.   
  4. #include <QtGui/QMainWindow>  
  5. #include "ui_WriteSharedMemory.h"  
  6. #include <QSharedMemory>  
  7. #include <QSystemSemaphore>  
  8. class WriteSharedMemory : public QMainWindow  
  9. {  
  10.     Q_OBJECT  
  11.   
  12. public:  
  13.     WriteSharedMemory(QWidget *parent = 0, Qt::WFlags flags = 0);  
  14.     ~WriteSharedMemory();  
  15.     ///可用空间  
  16.     static  QSystemSemaphore freeSystemSem;  
  17.     ///已用空间  
  18.     static  QSystemSemaphore usedSystemSem;  
  19. public slots:  
  20.     ///写入共享内存  
  21.     void loadIntoSharedMem();  
  22.     void init();  
  23.     void write();  
  24.     QString read();  
  25.     ///循环写  
  26.     void run();  
  27.     void detach();  
  28.   
  29.        
  30. private:  
  31.     Ui::WriteSharedMemoryClass ui;  
  32.     QSharedMemory sharedMem;  
  33.     int  num;  
  34. };  
  35.   
  36. #endif // WRITESHAREDMEMORY_H  

 WriteSharedMemory.cpp文件

Cpp代码 
  1. #include "WriteSharedMemory.h"  
  2. #include <QBuffer>  
  3. #include <QDebug>  
  4. WriteSharedMemory::WriteSharedMemory(QWidget *parent, Qt::WFlags flags)  
  5.     : QMainWindow(parent, flags),sharedMem("MySharedMemory")  
  6. {  
  7.     ui.setupUi(this);  
  8.     num = 0;  
  9.     init();  
  10.     //connect(ui.loadButton, SIGNAL(clicked()), SLOT(loadIntoSharedMem()));  
  11.     connect(ui.loadButton, SIGNAL(clicked()), SLOT(run()));  
  12.     connect(ui.initBtn, SIGNAL(clicked()), SLOT(init()));  
  13.     connect(ui.detachBtn, SIGNAL(clicked()), SLOT(detach()));  
  14.       
  15. }  
  16.   
  17. WriteSharedMemory::~WriteSharedMemory()  
  18. {  
  19.   
  20. }  
  21.   
  22. QSystemSemaphore WriteSharedMemory::freeSystemSem("freeFpga", 3, QSystemSemaphore::Create);  
  23. QSystemSemaphore WriteSharedMemory::usedSystemSem("usedFpga", 3, QSystemSemaphore::Create);  
  24.   
  25. void WriteSharedMemory::init()  
  26. {  
  27.     // First, test whether a shared memory segment is already attached to the process.  
  28.     // If so, detach it  
  29.     if (sharedMem.isAttached())  
  30.     {  
  31.         if(!sharedMem.detach())  
  32.               
  33.         {  
  34.             ui.textEdit->append("WriteSharedMemory : detach failed.");  
  35.             qDebug()<< "WriteSharedMemory : detach failed.";  
  36.             return;  
  37.         }  
  38.           
  39.   
  40.     }  
  41.   
  42.   
  43.     if ( !sharedMem.create( 1024 ) )   
  44.     {  
  45.         ui.textEdit->append(tr("Unable to create shared memory segment."));  
  46.         qDebug()<< "WriteSharedMemory::Unable to create shared memory segment.";  
  47.         return;  
  48.     }  
  49.       
  50. }  
  51.   
  52. void WriteSharedMemory::loadIntoSharedMem()  
  53. {  
  54.     write();  
  55. }  
  56. void WriteSharedMemory::run()  
  57. {  
  58.     while(1)  
  59.     {  
  60.         loadIntoSharedMem();  
  61.         _sleep(2);  
  62.     }  
  63. }  
  64.   
  65.   
  66. QString WriteSharedMemory::read()  
  67. {  
  68.     QBuffer buffer;  
  69.     QDataStream in(&buffer);  
  70.     QString text;  
  71.   
  72.     sharedMem.lock();  
  73.     buffer.setData((char*)sharedMem.constData(), sharedMem.size());  
  74.     buffer.open(QBuffer::ReadOnly);  
  75.     in >> text;  
  76.     sharedMem.unlock();  
  77.     qDebug() << "WriteSharedMemory:: Read:" << text;  
  78.     return text;  
  79. }  
  80. void WriteSharedMemory::write( )  
  81. {  
  82.       
  83.     QString text = read();  
  84.   
  85.     QBuffer buffer;  
  86.     text = text + "C://project//projectFile" + QString::number(num) + ".txt;";  
  87.       
  88.   
  89.     buffer.open( QBuffer::ReadWrite );  
  90.     QDataStream out( &buffer );  
  91.     out << text;  
  92.     int size = buffer.size();  
  93.   
  94.     if(sharedMem.size()<size)  
  95.     {  
  96.         qDebug() << "共享内存空间不够!";  
  97.         return ;  
  98.     }  
  99.     num++;  
  100.   
  101.     freeSystemSem.acquire();  
  102.     // Write into the shared memory  
  103.     sharedMem.lock();  
  104.     char *to = (char*)sharedMem.data();  
  105.     const char *from = buffer.data().data();  
  106.     memcpy( to, from, qMin( sharedMem.size(), size ) );  
  107.     sharedMem.unlock();  
  108.     usedSystemSem.release();  
  109.   
  110.   
  111.     ui.textEdit_2->append(text);  
  112.     qDebug() << "WriteSharedMemory:: Write:" << text;  
  113. }  
  114.   
  115. void WriteSharedMemory::detach( )  
  116. {  
  117.     if (sharedMem.isAttached())  
  118.     {  
  119.         qDebug() << "attached";  
  120.         if(!sharedMem.detach())  
  121.             ui.textEdit->append("WriteSharedMemory:: detach failed.");  
  122.         else  
  123.             qDebug() << "WriteSharedMemory:: detached success.";  
  124.     }  
  125.   
  126. }  

 ReadSharedMemory.h文件

Cpp代码 
  1. #ifndef READSHAREDMEMORY_H  
  2. #define READSHAREDMEMORY_H  
  3.   
  4. #include <QtGui/QMainWindow>  
  5. #include "ui_ReadSharedMemory.h"  
  6. #include <QSharedMemory>  
  7. #include <QSystemSemaphore>  
  8. class ReadSharedMemory : public QMainWindow  
  9. {  
  10.     Q_OBJECT  
  11.   
  12. public:  
  13.     ReadSharedMemory(QWidget *parent = 0, Qt::WFlags flags = 0);  
  14.     ~ReadSharedMemory();  
  15.     ///可用空间  
  16.     static  QSystemSemaphore freeSystemSem;  
  17.     ///已用空间  
  18.     static  QSystemSemaphore usedSystemSem;  
  19. public slots:  
  20.     ///读取共享内存  
  21.     void loadFromSharedMem();  
  22.     void read();  
  23.     ///循环读  
  24.     void run();  
  25.     void detach();  
  26.     void attach();  
  27. private:  
  28.     Ui::ReadSharedMemoryClass ui;  
  29.     QSharedMemory sharedMem;  
  30. };  
  31.   
  32. #endif // READSHAREDMEMORY_H  

 ReadSharedMemory.cpp文件

Cpp代码 
  1. #include "ReadSharedMemory.h"  
  2. #include <QBuffer>  
  3. #include <QDataStream>  
  4. #include <QDebug>  
  5. ReadSharedMemory::ReadSharedMemory(QWidget *parent, Qt::WFlags flags)  
  6.     : QMainWindow(parent, flags),sharedMem("MySharedMemory")  
  7. {  
  8.     ui.setupUi(this);  
  9.     connect(ui.showButton, SIGNAL(clicked()), SLOT(run()));  
  10.     connect(ui.detachBtn, SIGNAL(clicked()), SLOT(detach()));  
  11.     connect(ui.attachBtn, SIGNAL(clicked()), SLOT(attach()));  
  12.   
  13. }  
  14.   
  15. ReadSharedMemory::~ReadSharedMemory()  
  16. {  
  17.   
  18. }  
  19.   
  20. QSystemSemaphore ReadSharedMemory::freeSystemSem("freeFpga", 3, QSystemSemaphore::Open);  
  21. QSystemSemaphore ReadSharedMemory::usedSystemSem("usedFpga", 3, QSystemSemaphore::Open);  
  22.   
  23. void ReadSharedMemory::read()  
  24. {  
  25.     if(sharedMem.isAttached())  
  26.     {  
  27.         //qDebug() << "ReadSharedMemory:: haved attached.";  
  28.     }  
  29.     else   
  30.     {  
  31.         if(!sharedMem.attach())   
  32.         {  
  33.             //If an attempt of reading from the shared memory before data is written  
  34.             QSharedMemory::SharedMemoryError m = sharedMem.error();  
  35.             qDebug() << "ReadSharedMemory:: attach failed.";  
  36.             return;  
  37.   
  38.         }  
  39.         else  
  40.         {  
  41.             qDebug() << "ReadSharedMemory:: attach success.";  
  42.         }  
  43.     }  
  44.   
  45.     QBuffer buffer;  
  46.     QDataStream in(&buffer);  
  47.     QString text;  
  48.   
  49.     usedSystemSem.acquire();  
  50.     sharedMem.lock();  
  51.     buffer.setData((char*)sharedMem.constData(), sharedMem.size());  
  52.     buffer.open(QBuffer::ReadOnly);  
  53.     in >> text;  
  54.     //清空缓存  
  55.     char* to = (char*)sharedMem.data();  
  56.     memset(to,0,sharedMem.size());  
  57.     sharedMem.unlock();  
  58.   
  59.     freeSystemSem.release();  
  60.       
  61.     // As this is the last process attached to the shared memory segment  
  62.     // the shared memory segment is released, destroying its contents  
  63.     //sharedMem.detach();  
  64.     ui.textEdit_2->append(text);  
  65.     QStringList fileList = text.split(";");  
  66.   
  67.   
  68.     QStringList::const_iterator constIterator;  
  69.     for (constIterator = fileList.constBegin(); constIterator < fileList.constEnd()-1;  
  70.         ++constIterator)  
  71.     qDebug() <<"ReadSharedMemory:: Read:"<< (*constIterator).toLocal8Bit().constData();  
  72. }  
  73. void ReadSharedMemory::loadFromSharedMem()  
  74. {  
  75.     read();  
  76. }  
  77.   
  78. void ReadSharedMemory::run()  
  79. {  
  80.     while(1)  
  81.     {  
  82.         loadFromSharedMem();  
  83.     }  
  84. }  
  85.   
  86. void ReadSharedMemory::detach( )  
  87. {  
  88.     if (sharedMem.isAttached())  
  89.     {  
  90.         qDebug() << "attached";  
  91.         if(!sharedMem.detach())  
  92.             qDebug() << "ReadSharedMemory::detached failed.";  
  93.         else  
  94.             qDebug() << "ReadSharedMemory::detached success.";  
  95.     }  
  96.   
  97. }  
  98.   
  99. void ReadSharedMemory::attach()  
  100. {  
  101.     if(sharedMem.isAttached())  
  102.         ui.textEdit->append(tr("ReadSharedMemory:: sharedMem is attched by this process."));  
  103.     if (!sharedMem.attach())   
  104.     {  
  105.         //If an attempt of reading from the shared memory before data is written  
  106.         QSharedMemory::SharedMemoryError m = sharedMem.error();  
  107.         qDebug() << "ReadSharedMemory:: attach failed.";  
  108.   
  109.     }  
  110.     else  
  111.     {  
  112.         qDebug() << "ReadSharedMemory:: attach success.";  
  113.   
  114.     }  
  115. }  

 

  • 3
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值