1. 程式人生 > >qt 共享記憶體(QSharedMemory)

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(); //把共享記憶體解鎖

——————————————————讀取部分—————————————————— 照樣不誤的引用上一部分的標頭檔案…… 照常不忘的宣告共享記憶體 QSharedMemory sharemem; 宣告共享記憶體的金鑰和讀出來的字串 QString key,readstring; 宣告緩衝區 QBuffer buffer; 宣告資料流 QDataStream out(&buffer); 讓使用者輸入共享記憶體的金鑰 qDebug() << "Please input the shared memory key:";  cin >> key; 設定共享記憶體的訪問金鑰。使其能夠找到指定共享記憶體 sharemem.setKey(key); 找到指定的共享記憶體後關聯此記憶體 (此處可以理解為:去某人的家要東西) sharemem.attach(); 鎖上共享記憶體。(此處可以理解為:關上門,不允許其他人進來) sharemem.lock(); 用緩衝區得到共享記憶體關聯後得到的資料和資料大小 buffer.setData((char *)sharemem.constData(),sharemem.size()); 開啟緩衝區進行訪問 buffer.open(QBuffer::ReadOnly); 使用資料流從緩衝區獲得共享記憶體的資料,然後輸出到字串中 out >> readstring; 解鎖共享記憶體空間 (此處可以理解為:開門,允許其他人進來) sharemem.unlock(); 與共享記憶體空間分離 (此處可以理解為:我走了,我從家裡出去了) sharemem.detach();