OSMboxPend() 等待消息时遇到的问题

首先根据书中讲解的实例代码(标准实例来源于UCOS ii经典教程 邵贝贝)

 1 OS_EVENT *CommMbox;
 2
 3 void CommTask(void *pdata)
 4 {
 5      INT8U err;
 6      void *msg;
 7
 8      pdata = pdata;  //防止编译器报错
 9
10      for(;;)
11      {
12          msg = OSMboxPend(CommMbox, 10, &err)
13
14          if(OS_ERR_NONE == err)
15          {
16                /***正确接受代码***/
17           }
18           else
19           {
20               /***在指定时间内没有接收到消息代码处理***/
21           }
22         OSTimeDly(10);
23       }
24 }

并且在另一个任务中进行消息发送,如下代码

 1 void PostMbox(void *pdata)
 2 {
 3     INT8U err;
 4
 5     for(;;)
 6     {
 7
 8        if(/*条件成立*/)
 9        {
10           err = OSMboxPost(CommMbox, &variable);
11           if(OS_ERR_NONE == err)
12           {
13              printf("post a message\r\n");
14           }
15        }
16      OSTimeDly(10);
17     }
18
19 }

无论是断点调试,还是从输出的调试信息中都可以确定每次都有消息发送,但是在OSMboxPend中始终没有接收到消息导致err一直等于OS_TIMEOUT而无法进行正确消息处理

但是只要有消息发送出来,通过调试断点可以看到void CommTask(void *pdata)中的*msg的值都是改变了的(并且是我们同过消息发出的值)。

21:18:14  2016-08-25

时间: 2024-12-28 12:12:27

OSMboxPend() 等待消息时遇到的问题的相关文章

改进的延时函数Delay(使用MsgWaitForMultipleObjects等待消息或超时的到来)

解决上一节中延时函数占CPU使用率(达50%)的第二种方法是利用消息机制,通过API函数MsgWaitForMultipleObjects等待消息或超时的到来,从而避免使用循环检测使CPU占用率过高.完整的改进版Delay函数代码如下: [delphi] view plaincopyprint? procedure Delay(dwMilliseconds:DWORD); var endTick: DWORD; Event: THandle; begin Timer1.Enabled:=Fals

解决Handler发送消息时:this message is already in use

为了避免在主线程中进行耗时操作,我们经常使用handler来发送消息处理耗时操作. 有时候会出现程序崩溃然后控制台显示this message is already in use的报错信息 报错的信息是指:发送的message正在消息队列中,不能被使用. 其实就是当我们想多次发送消息时,不能使用同一个消息的意思,所以解决的方法就是再次发送的时候重新获取一个新的消息. 注: 不推荐直接使用Message的构造方法创建对象,而是应该通过Message类的静态方法obtain()获取消息对象,该方法会

MFC中如何在TreeCtrl控件中获取鼠标左键消息时的有效点击位置

MFC中,当在TreeCtrl控件中添加鼠标左键消息时,就意味着,凡是在该控件中点击左键后即会响应鼠标左键的消息,可有时我们只想记下有效的鼠标左键点击的事件,如图所示: 只想在CheckBox中点击鼠标左键时,将已选中的Item的句柄存入到链表中,那么如何只将有效的鼠标左键的消息存入链表中呢? 下面是响应鼠标左键消息时从所有鼠标左键消息都响应到只响应有效的左键消息的三个版本: 当响应鼠标左键的消息时,第一个版本: 获取鼠标的点击位置(注意:此时获取的是针对于当前屏幕的鼠标点击位置,所以需要将其转

C# UdpClient使用Receive和BeginReceive接收消息时的不同写法

使用Receive(同步阻塞方式), 注意使用同步方法时,需要使用线程来开始方法,不然会使UI界面卡死 IPEndPoint RemoteIpEndPoint = new IPEndPoint(IPAddress.Any, 5858); UdpClient udpClient = new UdpClient(RemoteIpEndPoint); while (true) //由于Receive方法是阻塞方法,一个Receive操作完了后才能继续往下执行,所以能在这里使用死循环 { Byte[]

[Erlang_Question29]进程收到不是期望的消息时怎么办?

最近在项目中升级了第三方库,导致本应用gen_server中A进程中: handle_info({add,X},Sum) -> {noreply,Sum+X}; 结果这么简单的一个工作居然不工作了,一查,发现是第三方库进程B发来的消息由 {add,X}------->{plus,X} 在A进程中存着大量的{plus,X}信息,使得这个进程的内存占用也变得异常的大. 简单修复后,不经意在想: 到底怎么处理那些我们期望不到的消息呢?(这种错误根本就是对方不应该发这种消息给我,根本就不是我自己的错呀

.net MVC 微信公众号 点击菜单拉取消息时的事件推送

官方文档:https://mp.weixin.qq.com/wiki?t=resource/res_main&id=mp1421141016&token=&lang=zh_CN 业务描述:点击菜单,推送消息,消息内容为自定义的读取数据库信息之后,为用户推送的动态消息. 首先需要用代码实现自定义菜单,为对应的菜单指定click事件. 关于自定义菜单的创建及事件指定,请看上一篇文章,本篇主要介绍事件响应的实现. MVC controller 中的代码如下: public void Me

mfc编程之发送wm_paint消息时绘图界面只出现一瞬间

实现的功能是在打开一个文件然后把文件的图形信息绘制在picture控件上. 问题描述:我把绘制的操作放在了窗口中onpaint()函数里,打开文件后发送一个wm_paint的消息,发现picture控件的绘图内容只显示了一瞬间.窗口中中有picture控件和其它的一些按钮控件静态文本控件等,调试的时候把断点放在了onpaint()函数结尾处,发现picture控件的绘制内容先出现,然后再出现按钮控件等同时picture的绘制内容不见了. 解决办法,因为绘图是在picture控件中所以绘制操作消息

iOS 推送,当接到推送消息时如何处理?

接收到通知时有两种进入的方式:1.当app未运行时(BOOL)application:(UIApplication *)application didFinishLaunchingWithOptions:(NSDictionary *)launchOptions:launchOptions不会为空,就可以根据launchOptions是否为空来判断是否有推送消息,当launchOptions不为空时,你就可以发一个通知,可以再rootViewController中接收通知执行响应的操作.2.当a

spring+activemq中多个consumer同时处理消息时遇到的性能问题

最近在做数据对接的工作,用到了activemq,我需要从activemq中接收消息并处理,但是我处理数据的步骤稍微复杂,渐渐的消息队列中堆的数据越来越多,就想到了我这边多开几个线程来处理消息. 可是会发现,服务器占用的网络带宽变的异常的高,仔细分析发现,mq入队时并没有异常高的网络流量,仅仅在出队时会产生很高的网络流量.最终发现是spring的jmsTemplate与activemq的prefetch机制配合导致的问题.研究源码发现jmsTemplate实现机制是:每次调用receive()时都