共享記憶體實現程序間大資料的交換

2021-04-18 11:52:51 字數 1297 閱讀 2953

typedef struct tagcopydatastruct copydatastruct;

資料的傳送實際是將資料從傳送方寫到共享記憶體中,然後由接收程式及時從中取走即可。資料從傳送方程式寫到共享內 存比較簡單,只需用memcpy()函式將資料拷貝過去,關鍵在於能及時通知接收程式資料已寫入到共享記憶體,並讓其即使取走。在這裡仍採取訊息通知的方 式,當資料寫入共享記憶體後通過postmessage()函式向接收方程式傳送訊息,接收方在訊息響應函式中完成對資料的讀取:

// 資料複製到共享記憶體 memcpy(lpdata, recvbuf, sizeof(recvbuf)); // 通知接收方接收資料 hwnd hdecode = ::findwindow(null, decode_programm); if (hdecode != null) ::postmessage(hdecode, wm_data_ready, (wparam)0, (lparam)sizeof(recvbuf));

當資料傳輸結束,即將退出程式時,需要將對映進來的記憶體檔案對映物件檢視解除安裝和資源的釋放等處理。這部分工作主要由unmapviewoffile()和closehandle()等函式完成:

hwnd hdecode = ::findwindow(null, decode_programm); if (hdecode != null) ::postmessage(hdecode, wm_map_close, 0, 0); if (lpdata != null) if (hrecvmap != null)

當傳送方程式將資料寫入到共享記憶體後,接收方將收到訊息wm_data_ready,在響應函式中將資料從共享 記憶體複製到本地快取中,再進行後續的處理。同傳送程式類似,在接收程式資料接收完畢後,也需要用unmapviewoffile()、 closehandle()等函式完成對檔案檢視等開啟過資源的釋放:

// 從共享記憶體接收資料 memcpy(recvbuf, (char*)(m_lpbreceivebuf), (int)lparam); …… // 程式退出前資源的釋放 unmapviewoffile(m_lpbreceivebuf); m_lpbreceivebuf = null; closehandle(m_hreceivemap); m_hreceivemap = null;

小結經實際測試,使用共享記憶體在處理大資料量資料的快 速交換時表現出了良好的效能,在資料可靠性等方面要遠遠高於傳送wm_copydata訊息的方式。這種大容量、高速的資料共享處理方式在設計高速數傳通 訊類軟體中有著很好的使用效果。本文所述**在windows 2000下由microsoft visual c++ 6.0編譯通過。

共享記憶體實現程序間通訊

1 物理檔案控制代碼 任何可以獲得的物理檔案控制代碼,如果你需要建立乙個物理檔案無關的記憶體對映也無妨,將它設定成為 0xffffffff invalid handle value 就可以了.如果需要和物理檔案關聯,要確保你的物理檔案建立的時候的訪問模式和 保護設定 匹配,比如 物理檔案唯讀,記憶體...

程序間共享記憶體

位於系統的交換分割槽 include incude int shmget key t key,size t size,int shm ipc excl ipc creat一起使用可確保共享記憶體已存在時返回錯誤 void shmat int shm id,const void shm addr,in...

共享記憶體實現程序間通訊 收藏

1 物理檔案控制代碼 任何可以獲得的物理檔案控制代碼,如果你需要建立乙個物理檔案無關的記憶體對映也無妨,將它設定成為 0xffffffff invalid handle value 就可以了.如果需要和物理檔案關聯,要確保你的物理檔案建立的時候的訪問模式和 保護設定 匹配,比如 物理檔案唯讀,記憶體...