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"。
文章標籤
全站熱搜