Qt共享記憶體QSharedMemory
在Qt中可以利用QSharedMemory類輕鬆實現共享記憶體,這裡舉一個例子:
一個程式讀取一張圖片並寫入共享記憶體段,另一個程式從共享記憶體段讀取並顯示出來
寫共享記憶體段程式碼,用new形式:
//在建構函式中寫
sharedMemeory = new QSharedMemory(this);
sharedMemeory->setKey("testtest");
//在某個按鈕的點選槽處寫
if(sharedMemeory->isAttached()){
if(sharedMemeory->detach())
qDebug()<<"detach...";
}
QPixmap map("C:/Users/admin/Desktop/me.jpg");
QBuffer buffer;
buffer.open(QBuffer::ReadWrite);
QDataStream stream(&buffer);
stream<<map;
//建立共享記憶體段
int size=buffer.size();
if(!sharedMemeory->create(size)){
qDebug()<<sharedMemeory->errorString();
return;
}
sharedMemeory->lock();
void* to =sharedMemeory->data();
void*from = (void*)buffer.data().data();
memcpy(to,from,buffer.size());
sharedMemeory->unlock();
qDebug()<<"load succ";
讀共享記憶體段,用臨時變數即可
QSharedMemory sharedMemeory;
sharedMemeory.setKey("testtest");
//共享記憶體段存在則繫結成功
if(!sharedMemeory.attach()){
qDebug()<<"attach error:"<<sharedMemeory.errorString();
return;
}
QBuffer buffer;
QDataStream stream(&buffer);
sharedMemeory.lock();
buffer.setData((char*)sharedMemeory.data(),sharedMemeory.size());
sharedMemeory.unlock();
buffer.open(QBuffer::ReadOnly);
QPixmap pix;
stream>>pix;
ui->label->setPixmap(pix);
總結:
兩個程式都要設定相同的key
一個程式sharedMemory.create【建立共享記憶體段】
則一個程式sharedMemory.attach【關聯共享記憶體段】就可以進行讀寫了。
當最後一個連線共享記憶體的程式執行detach後,共享記憶體段將會被釋放,若返回false通常意味著該段要麼沒有被附加,要麼被另一個程式鎖定。
相關文章
- QT之共享記憶體QT記憶體
- 共享記憶體記憶體
- Golang 共享記憶體Golang記憶體
- POSIX共享記憶體記憶體
- oracle 共享記憶體Oracle記憶體
- nginx共享記憶體分析Nginx記憶體
- 共享記憶體函式記憶體函式
- shmget() -- 建立共享記憶體記憶體
- SGA與共享記憶體記憶體
- linux共享記憶體Linux記憶體
- Qt 記憶體管理機制QT記憶體
- 自動共享記憶體管理 自動記憶體管理 手工記憶體管理記憶體
- Linux共享記憶體(二)Linux記憶體
- 修改/dev/shm共享記憶體dev記憶體
- 共享記憶體分段問題記憶體
- SGA與共享記憶體2記憶體
- Qt 記憶體管理機制薦QT記憶體
- 【記憶體管理】Oracle如何使用ASMM自動共享記憶體管理記憶體OracleASM
- nginx中共享記憶體的使用Nginx記憶體
- 程式間通訊---共享記憶體記憶體
- Linux共享記憶體的管理Linux記憶體
- 共享記憶體相關(ipcs/ipcrm)記憶體
- aix 共享記憶體段大小限制AI記憶體
- linux共享記憶體段研究Linux記憶體
- aix 共享記憶體段問題AI記憶體
- 第8章 管理共享記憶體記憶體
- UNIX共享記憶體的程式(轉)記憶體
- OpenResty 和 Nginx 的共享記憶體區是如何消耗實體記憶體的RESTNginx記憶體
- Android匿名共享記憶體(Ashmem)原理Android記憶體
- 程式間通訊之共享記憶體記憶體
- 修改OracleLinux共享記憶體的大小OracleLinux記憶體
- SGA與共享記憶體的關係記憶體
- 程序間通訊(3)-共享記憶體記憶體
- Linux釋放記憶體及手動釋放Oracle共享記憶體段Linux記憶體Oracle
- Golang併發之共享記憶體變數Golang記憶體變數
- Linux共享記憶體的核心實現Linux記憶體
- 解決ORACLE共享記憶體不足的方法Oracle記憶體
- opracle 共享記憶體 /etc/sysctl.conf記憶體