qt 共享記憶體(QSharedMemory)
(本次程式基於控制檯程式) 首先 使用共享記憶體得召喚一下: #include <QSharedMemory> 然後 宣告QSharedMemory類。並且命名為smem QSharedMemory smem; 由於共享記憶體沒有訪問金鑰,則不能找到共享的記憶體。我們給他設定一下訪問金鑰 QString key,sharedstring; 設定訪問金鑰 qDebug() << "Please input the shared memory key:"; cin >> key; 然後 宣告緩衝區和資料流。緩衝區用於轉換和儲存資料(使用之前要引用這兩個庫) QBuffer buffer; //緩衝區 QDataStream qdsm(&buffer); //資料流 判斷輸入訪問金鑰之後,是否附加到共享記憶體。如果是,則分離 if(smem.isAttached()) smem.detach(); //判斷是否已經連線到共享記憶體塊 如果是的話 就先分離 讓使用者輸入共享的資料 qDebug() << "Please input the string to share:"; cin >> sharedstring; 以可讀可寫的方式開啟緩衝區 buffer.open(QBuffer::ReadWrite); //設定讀取模式 把共享的字串輸入到資料流 qdsm << sharedstring; //輸入共享字串到資料流 輸入到資料流之後 會影響到緩衝區。緩衝區就會得到資料的大小 int size = buffer.size(); //獲得位元組大小 讓共享記憶體建立一段記憶體空間,空間大小為緩衝區資料大小。並且檢測是否建立成功 if(!smem.create(size)) //檢測共享記憶體段是否建立成功 { qDebug() << "Could not create sharing memory"; return a.exec(); } 如果建立成功後。為了讓程式做讀寫操作,不讓其他的程式影響。我們就先鎖上共享記憶體 smem.lock(); //鎖定共享記憶體 我們先分別獲取建立後共享記憶體的資料的指標和要共享的字串的資料的指標 char * to = (char *)smem.data(); //共享記憶體的資料 const char * from = buffer.data().data(); //被共享記憶體的資料 利用記憶體拷貝函式(memcpy),把要共享的資料拷貝到共享資料的空間裡。拷貝的資料大小是兩者中小的那位。哪位小就是要共享的資料的大小(沒有證實) memcpy(to,from,qMin(smem.size(),size)); //把要共享的記憶體拷貝到被共享的記憶體 解鎖共享記憶體空間。使其能夠被其他程式訪問 smem.unlock(); //把共享記憶體解鎖