小男孩‘自慰网亚洲一区二区,亚洲一级在线播放毛片,亚洲中文字幕av每天更新,黄aⅴ永久免费无码,91成人午夜在线精品,色网站免费在线观看,亚洲欧洲wwwww在线观看

分享

進(jìn)程間通信

 SanySmile 2013-04-08
進(jìn)程間通信主要有幾種方式:共享內(nèi)存、文件、SOCKET和OPC等,其中共享內(nèi)存的方式最為高效,設(shè)計(jì)到通信就需要同步。
基于這些需求實(shí)現(xiàn)了一個(gè)簡單的類可以很好解決共享內(nèi)存用于進(jìn)程間通信和數(shù)據(jù)共享。

  1. class CShareMemMng  
  2. {
  3. public:
  4.     CShareMemMng(const string& strName, int dBlockCount = 1024, BOOL bType = TRUE);
  5.     virtual ~CShareMemMng();

  6. public:
  7.     BOOL        SaveDataInfo(const DateInfo& Info);

  8.     BOOL        SetDataInfo(const DateInfo& Info, BOOL bSend);
  9.     DateInfo    GetDataInfo();
  10.     void        CompleateInfo(const DateInfo& Info);

  11. protected:
  12.     BOOL    InitBlockList();
  13.     BOOL    UnitBlockList();

  14.     DateInfo    FindDataInfo(SOCKET hSocket);
  15.     void        DelDataInfo(SOCKET hSocket);
  16.     void        ModifyInfo(const DateInfo& Info);
  17.     void        AddDataInfo(DateInfo* Info);
  18.     void        DelAllDataInfo();
  19. private:
  20.     HANDLE  m_hShareMem;    
  21.     char*   m_pMemBuff;
  22.     string  m_sMemName;
  23.     int     m_nBlockCount;
  24.     BOOL    m_bType;

  25.     list<CBlock*> m_BlockList;
  26.     map<SOCKET, DateInfo*>    m_DataList;

  27.     CMyMutex        m_DataInfoMutex;
  28.    
  29.     CMyEvent*   m_pEvent;
  30. };

根據(jù)實(shí)際情況和要求不一樣,Windows系統(tǒng)提供了不同類型的進(jìn)程通信方式。

1. 文件映射;文件映射(Memory-Mapped <coding-1 lang="other"> Files)能使進(jìn)程把文件內(nèi)容當(dāng)作進(jìn)程地址區(qū)間一塊內(nèi)存那樣來對(duì)待。因此,進(jìn)程不必使用文件I/O操作,只需簡單的指針操作就可讀取和修改文件的內(nèi)容。

</coding>
2. 共享內(nèi)存:Win32 API中共享內(nèi)存(Shared

  1. Memory)實(shí)際就是文件映射的一種特殊情況。進(jìn)程在創(chuàng)建文件映射對(duì)象時(shí)用0xFFFFFFFF來代替文件句柄(HANDLE),就表示了對(duì)應(yīng)的文件映射對(duì)象是從操作系統(tǒng)頁面文件訪問內(nèi)存,其它進(jìn)程打開該文件映射對(duì)象就可以訪問該內(nèi)存塊。由于共享內(nèi)存是用文件映射實(shí)現(xiàn)的,所以它也有較好的安全性,也只能運(yùn)行于同一計(jì)算機(jī)上的進(jìn)程之間。

3. 匿名管道:管道(Pipe)是一種具有兩個(gè)端點(diǎn)的通信通道:有一端句柄的進(jìn)程可以和有另一端句柄的進(jìn)程通信。管道可以是單向-一端是只讀的,另一端點(diǎn)是只寫的;也可以是雙向的一管道的兩端點(diǎn)既可讀也可寫。
4. 命名管道:命名管道(Named Pipe)是服務(wù)器進(jìn)程和一個(gè)或多個(gè)客戶進(jìn)程之間通信的單向或雙向管道。不同于匿名管道的是命名管道可以在不相關(guān)的進(jìn)程之間和不同計(jì)算機(jī)之間使用,服務(wù)器建立命名管道時(shí)給它指定一個(gè)名字,任何進(jìn)程都可以通過該名字打開管道的另一端,根據(jù)給定的權(quán)限和服務(wù)器進(jìn)程通信。
5. 郵件槽:郵件槽(Mailslots)提供進(jìn)程間單向通信能力,任何進(jìn)程都能建立郵件槽成為郵件槽服務(wù)器。其它進(jìn)程,稱為郵件槽客戶,可以通過郵件槽的名字給郵件槽服務(wù)器進(jìn)程發(fā)送消息。進(jìn)來的消息一直放在郵件槽中,直到服務(wù)器進(jìn)程讀取它為止。一個(gè)進(jìn)程既可以是郵件槽服務(wù)器也可以是郵件槽客戶,因此可建立多個(gè)郵件槽實(shí)現(xiàn)進(jìn)程間的雙向通信。
6. 剪貼板:剪貼板(Clipped Board)實(shí)質(zhì)是Win32 API中一組用來傳輸數(shù)據(jù)的函數(shù)和消息,為Windows應(yīng)用程序之間進(jìn)行數(shù)據(jù)共享提供了一個(gè)中介,Windows已建立的剪切(復(fù)制)-粘貼的機(jī)制為不同應(yīng)用程序之間共享不同格式數(shù)據(jù)提供了一條捷徑。當(dāng)用戶在應(yīng)用程序中執(zhí)行剪切或復(fù)制操作時(shí),應(yīng)用程序把選取的數(shù)據(jù)用一種或多種格式放在剪貼板上。然后任何其它應(yīng)用程序都可以從剪貼板上拾取數(shù)據(jù),從給定格式中選擇適合自己的格式。
7. 動(dòng)態(tài)數(shù)據(jù)交換:動(dòng)態(tài)數(shù)據(jù)交換(DDE)是使用共享內(nèi)存在應(yīng)用程序之間進(jìn)行數(shù)據(jù)交換的一種進(jìn)程間通信形式。應(yīng)用程序可以使用DDE進(jìn)行一次性數(shù)據(jù)傳輸,也可以當(dāng)出現(xiàn)新數(shù)據(jù)時(shí),通過發(fā)送更新值在應(yīng)用程序間動(dòng)態(tài)交換數(shù)據(jù)。
8. WM_COPYDATA消息:WM_COPYDATA是一種非常強(qiáng)大卻鮮為人知的消息。當(dāng)一個(gè)應(yīng)用向另一個(gè)應(yīng)用傳送數(shù)據(jù)時(shí),發(fā)送方只需使用調(diào)用SendMessage函數(shù),參數(shù)是目的窗口的句柄、傳遞數(shù)據(jù)的起始地址、WM_COPYDATA消息。接收方只需像處理其它消息那樣處理WM_COPY

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶發(fā)布,不代表本站觀點(diǎn)。請注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購買等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點(diǎn)擊一鍵舉報(bào)。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請遵守用戶 評(píng)論公約

    類似文章 更多