打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
在WINCE下的点对点消息队列CreateMsgQueue
 

       Wince下支持一种进程通信的方法,叫做点对点消息队列。为了和消息队列通信,一个或者一对进程创建一个读队列和一个写队列。调用创建函数或者打开队列的函数,只能指定它是读还是写,不能同时拥有读写权限。

    当一个队列创建时,消息的最大个数和每条消息的最大长度被定义。如果队列已经填满,这时进行写操作,写函数将被阻塞(等待队列中出现空的槽),或者是立刻返回失败,或者是在返回失败之前等待一段指定的时间。同样的,读函数可以被阻塞,直到队列中出现新的未读消息,或者在返回失败前等待一段时间。

    一条消息可以被标记为一条“警告”消息。警告消息被送往队列的最前,这样下一次读操作就能够读到这条警告消息,而不管队列中还有多少未读消息。同一时刻队列中只能传送一条警告消息。

   

    说了这么多了,现在开始讲一下要用到的哪些API函数:

1、创建消息队列,调用这个函数:

HANDLE CreateMsgQueue(

  LPCWSTR lpszName,//队列的名称

  LPMSGQUEUEOPTIONS lpOptions //指向一个MSGQUEUEOPTIONS

);

LpOptions指向一个MSGQUEUEOPTIONS结构体指针,该结构体定义如下:

typedef MSGQUEUEOPTIONS_OS{

  DWORD dwSize;//sizeof(MSGQUEUEOPTIONS)

  DWORD dwFlags;//描述队列的行为有MSGQUEUE_NOPRECOMMIT//MSGQUEUE_ALLOW_BROKEN

  DWORD dwMaxMessages;//同一时刻消息的最大数目

  DWORD cbMaxMessage;// 每条消息最大长度

  BOOL bReadAccess; // TRUE-创建读队列、FALSE – 创建写队列

} MSGQUEUEOPTIONS

如果一个已经创建的队列可以用下面函数来打开:

HANDLE OpenMsgQueue(

  HANDLE hSrcProc,//原来打开队列的进程句柄

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

  LPMSGQUEUEOPTIONS lpOptions  //指向一个MSGQUEUEOPTIONS

);

2、向队列写入一条消息,调用:

BOOL WriteMsgQueue(

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

  LPVOID lpBuffer,//指向包含消息的缓冲区

  DWORD cbDataSize,//消息大小

  DWORD dwTimeout,//指定等待时间

  DWORD dwFlags  //消息数据值

);

3、从队列读去消息,调用:

BOOL ReadMsgQueue(

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

  LPVOID lpBuffer, //指向接受消息的缓冲区

  DWORD cbBufferSize, //缓冲区的大小

  LPDWORD lpNumberOfBytesRead, //实际读取的消息大小

  DWORD dwTimeout, //指定等待时间

  DWORD* pdwFlags //存储消息数据值

);

了解上面的知识就可以写一个测试程序了,Process A 创建一个名为TEXT("MyQueueName")写入队列,Process A 向消息队列中写入消息。Process B 创建一个名为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. }  
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
孙鑫VC视频教程笔记之第十五课“多线程与聊天室”
vc 堆管理函数
C++ 中怎样在一个类对象中使用多线程
Code Inject的新技术 安全矩阵(Security Matrix)学术与技术论坛 加密算法 密码学 ECC AES RSA 密码协议 数学模型 信息安全 数学软件-Security Matri
Win32多线程(1)
Windows多线程——临界区、事件、互斥量、信号量详解加代码
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服