close

    前幾天在研究兩個程式互相傳遞訊息的方法,一開始使用Socket互傳訊息有成功,但比較繁瑣且有時候會有些網路問題導致傳送失敗...

    於是開始尋找另一個可以讓兩個程式互相傳遞訊息的方法,SharedMemory則是其中一種!SharedMemory方法主要是分享同一區塊之記憶體給多個程式間使用,且程式間傳遞速度較快!也不會有網路相關問題。這方法可解決了不少煩惱呢。

 

Process1.h 

#include<qsharedmemory.h>

class Process1:publicQWidget
{
    ...
 
public:

    void SendMsg();

    QSharedMemory qSharedMemory1;

...
}

Process1.cpp

 
Process1::Process1(QWidget*parent):
QMainWindow(parent),
ui(new Ui::Process1)
 
{
 
 
    qSharedMemory1.setKey("QSharedMemoryMsg"); //設定空間名稱

....
}
 
void Process1::SendMsg()
{
    QString sMsg="Hello";
    QBuffer buffer;
    buffer.open(QBuffer::ReadWrite);
    QDataStreamout(&buffer);
    out<<sMsg;
    int size=buffer.size();
 
    if(!qsharedMemory1.create(size)){
      qDebug()<<__FUNCTION__<<__LINE__ <<tr("Unable to create shared
memory segment.
);
    }
    else
    {
       qsharedMemory1.lock();
       char*to=(char*)qsharedMemory1.data();
       constchar*from=buffer.data().data();
       memcpy(to,from,qMin(qsharedMemory1.size(),size));
       qsharedMemory1.unlock(); 
    }

}

上述方法即可將"Hello"字串存放在所指定的記憶體空間了。

接著下來我們要讓另一個程式去擷取記憶體空間上的訊息。

 

Process2.h 

 

#include<qsharedmemory.h>

 

class Process2:publicQWidget

 

{

 

    ...

 

 

 

public:

    void ReceiveMsg();

 

    QSharedMemory qSharedMemory2;

...
}

 

Process2.cpp

 

 

 

Process2::Process2(QWidget*parent):

 

QMainWindow(parent),

 

ui(new Ui::Process2)

 

{

 

    qSharedMemory2.setKey("QSharedMemoryMsg"); //設定空間名稱

 


....

 

}

 

 

 

void Process2::ReceiveMsg()

 

{

 

 
    if(!qsharedMemory2.attach()){
 
        qDebug()<<__FUNCTION__<<__LINE__<<"Unable to attach to shared
memory segment"
;
 
    }
 
    else
 
    {
 
        QBuffer buffer;
 
        QDataStream in(&buffer);
 
        QStrings ReceiveMsg;
 
 
 
        qsharedMemory2.lock();
 
        buffer.setData((char*)qsharedMemory2.constData(),qsharedMemory2.size());
 
        buffer.open(QBuffer::ReadOnly);
 
        in>>sReceiveMsg;
 
        qsharedMemory2.unlock();
 
 
 
        qsharedMemory2.detach();
 
 
 
    }
 

 


}

最後抓到的值存在ReceiveMsg變數裡,也就是"Hello"。

 

 
arrow
arrow
    文章標籤
    QT
    全站熱搜
    創作者介紹
    創作者 力寶 的頭像
    力寶

    body0314的部落格

    力寶 發表在 痞客邦 留言(0) 人氣()