向消息队列发送一个消息(后进先出LIFO),OSQPostFront()
2017-04-13 09:59
218 查看
OSQPostFront()函数和OSQPost()基本上是一样的,只是在插入新的消息到消息队列中时,使用.OSQOut作为指向下一个插入消息的单元的指针,而不是.OSQIn。程序清单 L6.24是它的源代码。值得注意的是,.OSQOut指针指向的是已经插入了消息指针的单元,所以再插入新的消息指针前,必须先将.OSQOut指针在消息队列中前移一个单元。如果.OSQOut指针指向的当前单元是队列中的第一个单元[L6.24(1)],这时再前移就会发生越界,需要特别地将该指针指向队列的末尾[L6.24(2)]。由于.OSQEnd指向的是消息队列中最后一个单元的下一个单元,因此.OSQOut必须被调整到指向队列的有效范围内[L6.24(3)]。因为QSQPend()函数取出的消息是由OSQPend()函数刚刚插入的,因此OSQPostFront()函数实现了一个LIFO队列。 程序清单 L6.24 向消息队列发送一条消息(LIFO) INT8U OSQPostFront (OS_EVENT *pevent, void *msg) { OS_Q *pq; OS_ENTER_CRITICAL(); if (pevent->OSEventType != OS_EVENT_TYPE_Q) { OS_EXIT_CRITICAL(); return (OS_ERR_EVENT_TYPE); } if (pevent->OSEventGrp) { OSEventTaskRdy(pevent, msg, OS_STAT_Q); OS_EXIT_CRITICAL(); OSSched(); return (OS_NO_ERR); } else { pq = pevent->OSEventPtr; if (pq->OSQEntries >= pq->OSQSize) { OS_EXIT_CRITICAL(); return (OS_Q_FULL); } else { if (pq->OSQOut == pq->OSQStart) { (1) pq->OSQOut = pq->OSQEnd; (2) } pq->OSQOut--; (3) *pq->OSQOut = msg; pq->OSQEntries++; OS_EXIT_CRITICAL(); } return (OS_NO_ERR); } }
相关文章推荐
- 向消息队列发送一个消息(FIFO),OSQPost()
- uC/OS-II V2.86 发送和等待一个队列消息的工作原理
- 消息队列实现从一个进程向另一个进程发送一个数据块的方法
- 0905使用msgsnd函数向消息队列中发送一个字符串数据信息“Hello!This is a te
- MSMQ消息队列,一个按钮发送,一个按钮接受
- 《精通Unix下C语言编程与项目实践》之八 消息队列发送模型 推荐
- 异常信息:CLR无法从COM 上下文0x645e18 转换为COM上下文0x645f88,这种状态已持续60秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作.这种情况通常会影响到
- 向一个指定窗口发送左键按下的消息,同时将左键按下的位置也发过去(譬如要编写连连看程序的外挂)
- 使用HTTP发送消息(消息队列技术)
- 第二人生的源码分析(三十八)构造一个消息包并发送
- FAQ12:每个线程一个消息队列?还是线程中的每个窗口各有一个消息队列?
- 第二人生的源码分析(三十八)构造一个消息包并发送
- MQ中将消息发送至远程队列的配置
- Delphi 中如何发送一个窗体上的按钮,按下消息
- CLR 无法从 COM 上下文 0x1a2740 转换为 COM 上下文 0x1a28b0,这种状态已持续 60 秒。拥有目标上下文/单元的线程很有可能执行的是非泵式等待或者在不发送 Windows 消息的情况下处理一个运行时间非常长的操作
- C#TCPClient应用-一个简单的消息发送和接收
- 使用HTTP发送消息(消息队列技术)
- 蔡军生先生第二人生的源码分析(三十八)构造一个消息包并发送
- 一个com+消息队列的例子
- 使用消息队列 异步插入数据,能发送消息,但是无法读取消息