Qt共享内存的使用

Qt主要是通过QSharedMemory类来访问以及操作共享内存。

以下是几个主要的步骤

1.对于QsharedMemory类的对象进行创建

利用QSharedMemory类创建实例对象时,必须为该共享内存指定关键字(即为该共享内存起一个名字)。只有当共享内存被设置了关键字之后,才可以执行创建create()、关联attach()等操作。为共享内存指定关键字有两种方法:

a.直接在通过构造函数来进行关键字设置:

比如:

    QSharedMemory sendsharedMem;
    QSharedMemory recvsharedMem;

MainWidget::MainWidget(QWidget *parent) :
    QWidget(parent),sendsharedMem("SHAREFILE"),recvsharedMem("SHAREFILE")
直接这样设置key

b. 对象构造好之后利用setKey来进行设置

比如:

 
 
 
 
	sendsharedMem.setKey("SHAREFILE");
	recvsharedMem.setKey("SHAREFILE");
这样来设置

2、创建共享内存

QSharedMemory::ReadOnly   只读方式访问共享内存

QSharedMemory::ReadWrite  读写方式访问共享内存

3、关联共享内存

bool QSharedMemory::attach AccessMode mode =ReadWrite )


4、分离共享内存

bool QSharedMemory::detach ()


5、判断共享内存的关联状态

bool QSharedMemory::isAttached ()const

void QSharedMemory::setKey (const QString key )        //设定共享内存关键字

 

6、锁定/解锁共享内存

bool QSharedMemory::lock ()                    //锁定共享内存

bool QSharedMemory::unlock ()         //解锁共享内存


总的步骤大概是这些,下面用一个示例来说明

界面是这样,open用来打开本地图片并在左边label显示,save用来存储进共享空间,show用来读取共享空间的图在右边label显示,exit是退出

[csharp]  view plain  copy
  1. //首先是打开本地图片并显示  
  2.   
  3. void Widget::InsertImage()  
  4. {  
  5.     ui->btn_1 = qobject_cast<QPushButton*>(sender());  
  6.     QString fileName = QFileDialog::getOpenFileName( this,  
  7.                                                     tr("打开文件"),  
  8.                                                     "C:/Users/Administrator/Desktop",  
  9.                                                     tr("任何文件(*.*)"  
  10.                                                     ";;文本文件(*.txt)"  
  11.                                                     ";;XML文件(*.xml)"  
  12.                                                     ";;Images (*.png *.xpm *.jpg)"));  
  13.     QMovie *move=new QMovie(fileName);  
  14.   
  15.     ui->lbl_1->setMovie(move);  
  16.     move->start();  
  17. }  

[csharp]  view plain  copy
  1. //然后是存储共享空间  
  2.   
  3. void Widget::loadfromsharedMem()  
  4. {  
  5.     sharedMemory.setKey("QSharedMemoryExample");<span style="white-space:pre">        </span>// 设置访问标识  
  6.   
  7.     if (sharedMemory.isAttached())<span style="white-space:pre">              </span>//判断是否连接到共享块  
  8.     {  
  9.         // 将该进程与共享内存段分离  
  10.         if (!sharedMemory.detach())  
  11.             qDebug() << "Unable to detach from shared memory.";  
  12.     }  
  13.   
  14.     QString fileName = QFileDialog::getOpenFileName(0, tr("打开文件"),  
  15.                                                     "C:/Users/Administrator/Desktop",  
  16.                                         tr("Images (*.png *.xpm *.jpg)"));  
  17.     QImage image;  
  18.     if (!image.load(fileName))  
  19.     {  
  20.         qDebug() << "Selected file is not an image, please select another.";  
  21.         return;  
  22.     }  
  23.   
  24.     // 将数据加载到共享内存中  
  25.     QBuffer buffer;                 <span style="white-space:pre">        </span>//将字符串转换为字节的介质  
  26.     buffer.open(QBuffer::ReadWrite);<span style="white-space:pre">            </span>//设置读取模式  
  27.     QDataStream out(&buffer);<span style="white-space:pre">               </span>//数据流  
  28.     out << image;  
  29.     int size = buffer.size();<span style="white-space:pre">                   </span>//获得字节大小  
  30.   
  31.     // 创建共享内存段  
  32.     if (!sharedMemory.create(size))<span style="white-space:pre">         </span>//检测共享内存是否创建成功  
  33.     {  
  34.         qDebug() << sharedMemory.errorString() << "\n Unable to create shared memory segment.";  
  35.         return;  
  36.     }  
  37.     sharedMemory.lock();<span style="white-space:pre">                            </span>//锁定共享内存  
  38.     char *to = (char*)sharedMemory.data();<span style="white-space:pre">          </span>//共享内存的数据  
  39.     const char *from = buffer.data().data();<span style="white-space:pre">            </span>//被共享内存的数据  
  40.     memcpy(to, from, qMin(sharedMemory.size(), size));<span style="white-space:pre">  </span>//将要共享的内存copy到被共享的内存  
  41.     sharedMemory.unlock();  
  42. }  

[csharp]  view plain  copy
  1. <span style="font-family:Arial;"><span style="line-height: 26px;">//接下来是读取  
  2.   
  3. void Widget::loadFromMemory()  
  4. {  
  5.     receiveMemory.setKey("QSharedMemoryExample");<span style="white-space:pre">   </span>//声明共享内存的密钥  
  6.   
  7.     // 将共享内存与该进程绑定  
  8.     if (!receiveMemory.attach())  
  9.     {  
  10.         ui->lbl_2->setText("Unable to attach from shared memory.");  
  11.         return;  
  12.     }  
  13.   
  14.     // 从共享内存中读取数据  
  15.     QBuffer buffer;<span style="white-space:pre">             </span>//声明缓冲区  
  16.     QDataStream in(&buffer)<span style="white-space:pre">         </span>//声明数据流  
  17.     QImage image;<span style="white-space:pre">   </span>  
  18.     receiveMemory.lock();<span style="white-space:pre">               </span>//锁定共享内存  
  19.     buffer.setData((char*)receiveMemory.constData(), receiveMemory.size())<span style="white-space:pre">  </span>//用缓冲区得到共享内存关联后得到的数据和数据大小  
  20.     buffer.open(QBuffer::ReadOnly);<span style="white-space:pre"> </span>//设置读取模式<span style="white-space:pre">   </span>  
  21.     in >> image;<span style="white-space:pre">          </span>//使用数据流从缓冲区获得共享内存的数据,然后输出到字符串中  
  22.     receiveMemory.unlock();<span style="white-space:pre">     </span>//解锁  
  23.   
  24.     receiveMemory.detach();<span style="white-space:pre">     </span>//与共享内存空间分离   
  25.     ui->lbl_2->setPixmap(QPixmap::fromImage(image));  
[csharp]  view plain  copy
  1. //最后是头文件内容  
  2.  
  3. #include <QWidget>  
  4. #include <QMovie>  
  5. #include <QFile>  
  6. #include <QFileDialog>  
  7. #include <QSharedMemory>  
  8. #include <QBuffer>  
  9. #include <QDebug>  
  10.   
  11. namespace Ui {  
  12. class Widget;  
  13. }  
  14.   
  15. class Widget : public QWidget  
  16. {  
  17.     Q_OBJECT  
  18.   
  19. public:  
  20.     explicit Widget(QWidget *parent = 0);  
  21.     ~Widget();  
  22.     void loadfromsharedMem();  
  23.     void loadFromMemory();  
  24.   
  25. public slots:  
  26.     void InsertImage();  
  27.   
  28. private slots:  
  29.     void on_btn_1_clicked();  
  30.   
  31.     void on_btn_2_clicked();  
  32.   
  33.     void on_btn_3_clicked();  
  34.   
  35.     void on_btn_4_clicked();  
  36.   
  37. private:  
  38.     Ui::Widget *ui;  
  39.     QSharedMemory sharedMemory;  
  40.     QSharedMemory receiveMemory;  
  41. };  
如果是lineEdit输入文字也是很简单的
void Widget::sendtosharedMem()
{
    send2sharedMem.setKey("QSharedMemoryExample");
 
 
    if (send2sharedMem.isAttached())
    {
        // 将该进程与共享内存段分离
        if (!send2sharedMem.detach())
            qDebug() << "Unable to detach from shared memory.";
    }
    bool ok;
 
 
    QString text = ui->textEdit->toPlainText();
 
 
    ok = TRUE;
 
 
 
 
    if (ok && text.length())
    {
 
 
        // 将数据加载到共享内存中
        QBuffer buffer;
        buffer.open(QBuffer::ReadWrite);
        QDataStream out(&buffer);
        out << text;
        int size = buffer.size();
 
 
        // 创建共享内存段
        if (!send2sharedMem.create(size))
        {
            qDebug() << send2sharedMem.errorString() << "\n Unable to create shared memory segment.";
            return;
        }
 
 
        send2sharedMem.lock();
        char *to = (char*)send2sharedMem.data();
        const char *from = buffer.data().data();
        memcpy(to, from, qMin(send2sharedMem.size(), size));
        send2sharedMem.unlock();
    }
    else
    {
        qDebug() << "You must write some texts.";
    }
}

这是读取

void MainWidget::recvDate()
{
	recvsharedMem..setKey("QSharedMemoryExample");
    if (!recvsharedMem.attach())
    {
        ui->textEdit_2->setText("No Share Data");
        return;
    }
 
 
    QBuffer buffer;
    QDataStream in(&buffer);
    QString text;
 
 
    recvsharedMem.lock();
    buffer.setData((char*)recvsharedMem.constData(), recvsharedMem.size());
    buffer.open(QBuffer::ReadOnly);
    in >> text;
    recvsharedMem.unlock();
 
 
    recvsharedMem.detach();
    ui->textEdit_2->setText(text);
}

猜你喜欢

转载自blog.csdn.net/CLinuxF/article/details/80360075
今日推荐