国产一级a片免费看高清,亚洲熟女中文字幕在线视频,黄三级高清在线播放,免费黄色视频在线看

打開APP
userphoto
未登錄

開通VIP,暢享免費電子書等14項超值服

開通VIP
在WINCE下的點對點消息隊列CreateMsgQueue
 

       Wince下支持一種進(jìn)程通信的方法,叫做點對點消息隊列。為了和消息隊列通信,一個或者一對進(jìn)程創(chuàng)建一個讀隊列和一個寫隊列。調(diào)用創(chuàng)建函數(shù)或者打開隊列的函數(shù),只能指定它是讀還是寫,不能同時擁有讀寫權(quán)限。

    當(dāng)一個隊列創(chuàng)建時,消息的最大個數(shù)和每條消息的最大長度被定義。如果隊列已經(jīng)填滿,這時進(jìn)行寫操作,寫函數(shù)將被阻塞(等待隊列中出現(xiàn)空的槽),或者是立刻返回失敗,或者是在返回失敗之前等待一段指定的時間。同樣的,讀函數(shù)可以被阻塞,直到隊列中出現(xiàn)新的未讀消息,或者在返回失敗前等待一段時間。

    一條消息可以被標(biāo)記為一條“警告”消息。警告消息被送往隊列的最前,這樣下一次讀操作就能夠讀到這條警告消息,而不管隊列中還有多少未讀消息。同一時刻隊列中只能傳送一條警告消息。

   

    說了這么多了,現(xiàn)在開始講一下要用到的哪些API函數(shù):

1、創(chuàng)建消息隊列,調(diào)用這個函數(shù):

HANDLE CreateMsgQueue(

  LPCWSTR lpszName,//隊列的名稱

  LPMSGQUEUEOPTIONS lpOptions //指向一個MSGQUEUEOPTIONS

);

LpOptions指向一個MSGQUEUEOPTIONS結(jié)構(gòu)體指針,該結(jié)構(gòu)體定義如下:

typedef MSGQUEUEOPTIONS_OS{

  DWORD dwSize;//sizeof(MSGQUEUEOPTIONS)

  DWORD dwFlags;//描述隊列的行為有MSGQUEUE_NOPRECOMMIT、//MSGQUEUE_ALLOW_BROKEN

  DWORD dwMaxMessages;//同一時刻消息的最大數(shù)目

  DWORD cbMaxMessage;// 每條消息最大長度

  BOOL bReadAccess; // TRUE-創(chuàng)建讀隊列、FALSE – 創(chuàng)建寫隊列

} MSGQUEUEOPTIONS

如果一個已經(jīng)創(chuàng)建的隊列可以用下面函數(shù)來打開:

HANDLE OpenMsgQueue(

  HANDLE hSrcProc,//原來打開隊列的進(jìn)程句柄

  HANDLE hMsgQ,//CreagteMsgQueue返回來的句柄

  LPMSGQUEUEOPTIONS lpOptions  //指向一個MSGQUEUEOPTIONS

);

2、向隊列寫入一條消息,調(diào)用:

BOOL WriteMsgQueue(

  HANDLE hMsgQ, // CreagteMsgQueue返回來的句柄

  LPVOID lpBuffer,//指向包含消息的緩沖區(qū)

  DWORD cbDataSize,//消息大小

  DWORD dwTimeout,//指定等待時間

  DWORD dwFlags  //消息數(shù)據(jù)值

);

3、從隊列讀去消息,調(diào)用:

BOOL ReadMsgQueue(

  HANDLE hMsgQ, // CreagteMsgQueue返回來的句柄

  LPVOID lpBuffer, //指向接受消息的緩沖區(qū)

  DWORD cbBufferSize, //緩沖區(qū)的大小

  LPDWORD lpNumberOfBytesRead, //實際讀取的消息大小

  DWORD dwTimeout, //指定等待時間

  DWORD* pdwFlags //存儲消息數(shù)據(jù)值

);

了解上面的知識就可以寫一個測試程序了,Process A 創(chuàng)建一個名為TEXT("MyQueueName")寫入隊列,Process A 向消息隊列中寫入消息。Process B 創(chuàng)建一個名為TEXT("MyQueueName")讀隊列,Process B 向消息隊列中讀取消息。程序如下:

Process A

 

 

  1. #define MSGQUEUENAME TEXT("MyQueueName")   
  2. #define MAX_MSGQUEUE_SIZE  10   
  3. #define MAX_MESSAGE_SIZE   MAX_PATH +1   
  4.   
  5. TCHAR szReadBuf[MAX_PATH] = {'a','b','c','d','e'};  
  6. HANDLE ghMsgQ = NULL;  
  7.   
  8. DWORD WriteMsgQProc(LPVOID lpParameter);  
  9.   
  10. MSGQUEUEOPTIONS opt1;  
  11. opt1.dwSize = sizeof(MSGQUEUEOPTIONS);  
  12. opt1.cbMaxMessage = MAX_MESSAGE_SIZE;  
  13. opt1.dwMaxMessages = MAX_MSGQUEUE_SIZE;  
  14. opt1.dwFlags = MSGQUEUE_ALLOW_BROKEN;  
  15. opt1.bReadAccess = FALSE;   
  16.   
  17. ghMsgQ = CreateMsgQueue(pName,&opt1);  
  18.   
  19. CreateThread(NULL,0,WriteMsgQProc,ghMsgQ,0,NULL);  
  20.   
  21. DWORD WriteMsgQProc(LPVOID lpParameter)  
  22. {  
  23.     HANDLE hMsgQ = reinterpret_cast<HANDLE>(lpParameter);  
  24.   
  25.     if(hMsgQ == NULL)  
  26.     {  
  27.         return 0;  
  28.     }  
  29.   
  30.     while(TRUE)  
  31.     {  
  32.         if(WriteMsgQueue(hMsgQ,szReadBuf,MAX_PATH,INFINITE,0))  
  33.         {  
  34.             RETAILMSG(TRUE,(TEXT("Write Queue Value:%s/r/n"),szReadBuf));  
  35.         }  
  36.           
  37.         Sleep(1000);  
  38.     }  
  39.   
  40. }  

Process B

 

  1. #define MSGQUEUENAME TEXT("MyQueueName")   
  2. #define MAX_MSGQUEUE_SIZE  10   
  3. #define MAX_MESSAGE_SIZE   MAX_PATH + 1   
  4.   
  5. TCHAR szReadBuf[MAX_PATH] = {0};  
  6. HANDLE ghMsgQ = NULL;  
  7.   
  8. DWORD ReadMsgQProc(LPVOID lpParameter);  
  9. MSGQUEUEOPTIONS opt1;  
  10. opt1.dwSize = sizeof(MSGQUEUEOPTIONS);  
  11. opt1.cbMaxMessage = MAX_MESSAGE_SIZE;  
  12. opt1.dwMaxMessages = MAX_MSGQUEUE_SIZE;  
  13. opt1.dwFlags = MSGQUEUE_ALLOW_BROKEN;  
  14. opt1.bReadAccess = TRUE;   
  15.   
  16. ghMsgQ = CreateMsgQueue(pName,&opt1);  
  17.   
  18. CreateThread(NULL,0,WriteMsgQProc,ghMsgQ,0,NULL);  
  19.   
  20. DWORD ReadMsgQProc(LPVOID lpParameter)  
  21. {  
  22.     HANDLE hMsgQ = reinterpret_cast<HANDLE>(lpParameter);  
  23.   
  24.     if(hMsgQ == NULL)  
  25.     {  
  26.         return 0;  
  27.     }  
  28.   
  29.     while(TRUE)  
  30.     {  
  31.         DWORD dwRead;  
  32.         DWORD dwFlag;    
  33.         if(ReadMsgQueue(hMsgQ,szReadBuf,MAX_PATH,&dwRead,INFINITE,&dwFlag))  
  34.         {  
  35.             RETAILMSG(TRUE,(TEXT("Read Queue Value:%s/r/n"),szReadBuf));  
  36.         }  
  37.   
  38.         Sleep(1000);  
  39.     }  
  40.   
  41. }  
本站僅提供存儲服務(wù),所有內(nèi)容均由用戶發(fā)布,如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請點擊舉報
打開APP,閱讀全文并永久保存 查看更多類似文章
猜你喜歡
類似文章
孫鑫VC視頻教程筆記之第十五課“多線程與聊天室”
vc 堆管理函數(shù)
C++ 中怎樣在一個類對象中使用多線程
Code Inject的新技術(shù) 安全矩陣(Security Matrix)學(xué)術(shù)與技術(shù)論壇 加密算法 密碼學(xué) ECC AES RSA 密碼協(xié)議 數(shù)學(xué)模型 信息安全 數(shù)學(xué)軟件-Security Matri
Win32多線程(1)
Windows多線程——臨界區(qū)、事件、互斥量、信號量詳解加代碼
更多類似文章 >>
生活服務(wù)
分享 收藏 導(dǎo)長圖 關(guān)注 下載文章
綁定賬號成功
后續(xù)可登錄賬號暢享VIP特權(quán)!
如果VIP功能使用有故障,
可點擊這里聯(lián)系客服!

聯(lián)系客服