文章主题

文章主题  

在我们的日常编程中,对消息队列的需求非常常见,使用一个简洁、高效的消息队列编程模型,对于代码逻辑的清晰性,对于事件处理的高效率来说,是非常重要的。这篇文章就来看看 ZWave 中是通过什么机制为我们提供了一个便捷的消息队列处理机制。

内容导航          内容导航

  • 消息队列是什么

  • 我自己写的消息队列

  • ZWave 消息队列的结构

  • ZWave 消息队列的使用(初始化、存储消息、取出消息)

消息队列是什么          消息队列是什么

消息队列最主要特点是:存储消息,先进先出。

比如在典型的生产者-消费者编程模型中,先创建一个消息队列,最大容量是 100。

当生产者产生一条消息时,如果消息队列未满,就放进消息队列的尾部。

消费者定期去检查消息队列中是否有消息,如果有,则取出最前面的那条消息进行处理,直到把队列中的所有消息都处理完。

当然,如果链表来创建一个动态的消息队列也是可以的,这样就可以构成一个无容量限制的队列,这个模型有点复杂,咱们暂且不讨论它S。

我自己写的消息队列

我自己写的消息队列  

在我自己的开发过程中,经常需要使用消息队列来保存多条消息,每一条消息都存储长度不等的字符串,于是就自己写了一个最简单的消息队列实现模板,当然对于项目来说也是最合适的,因为是量体裁衣嘛。

一共2个文件(.h, .c),每次项目中需要用到时,就把这2个文件拷贝过来,再简单修改一下(保存的每条消息满足应用的需求),就直接用上了。简单、粗暴、有效、好用,每次都能很块就解决我的问题。

这里简单截个图,如果需要,我可以免费分享!

使用起来也比较简单,只需要3个步骤。

ZWave 消息队列的结构  

ZWave SDK 的每一个 Sample 中已经给我们提供了一个很好的消息队列编程模型,不过它还嵌入了一个 task 任务管理的机制,后面我会简单画一下 task 的处理逻辑,但是不会深入探究。

先来看一下 ZWave 提供的消息队列的结构。

请注意:这是消息队列的结构,而这个队列中存储的每一条消息是存储在一个数组缓冲区中,通过 array 指针进行引用。因此,在消息队列初始化的时候,必须提供一个数组,并把数组的地址赋值给 array 指针。

关于这个数组,从代码中可以看到 QElementType 其实就是一个无符号字节,因此,这个消息队列仅仅能存储最最简单的消息,即:一个字节的数值。可以看一下 SwitchOnOff.c 中所存储的消息,都是 EVENT_APP 这个枚举类型的值。

ZWave 消息队列的使用

1.消息队列的初始化

在应用程序初始化的时候,ZWave 实例程序为我们已经创建好一个消息队列了,流程如下。

可以看到,一共有 2 个消息队列:eventQueue 和 jobQueue,这两个队列的实现机制都是一样的,只不过是把不同类型的消息放在不同的队列而已,因此,只要分析其中一个 eventQueue 就可以了。

初始化完成之后,存储消息的数组是空的,消息队列的有效消息个数是 0。

2.存储消息到消息队列

就是把一条新消息放入消息队列的数组中,然后更新消息队列的一些状态参数,比如:有效消息长度,存储的这条消息位置等等。

函数调用流程如下。

3.从消息队列中获取消息

这个也很好理解,就是通过消息队列的结构检查一下是否有消息等待处理。如果是的话,就取出消息,并更新消息队列的一些状态参数。

    函数调用流程如下。   

ZWave 文档中已经说明,协议层会定期调用应用层的函数 ApplicationPoll( ) ,这也是 ZWave 推荐的方式让应用层执行自己的逻辑,但是应用层不能在这个函数中执行太长时间。

在这个函数中,我们可以直接去消息队列中取出一个消息。但是如果这么做的话,就浪费了 ZWave 为我们提供的 Task 机制,因此这里调用了 TaskApplicationPoll( ),然后我们应用层的事件处理函数 AppStateManager( ) 就老老实实的待着,等待别人把事件消息准备好、喂过来。

其实,这也是一种分层编程思想,如下。

总结  

现在再回头看一下 ZWave 的消息队列处理机制,思路非常清晰,而且扩充性非常强。

后面我希望自己可以抽一点时间,把这里的代码抽取出来,写一个通用的、能够处理一些复杂消息的消息队列机制,让开发过程变得更加愉悦!


  1. 欢迎转载,请尊重版权,保留全部内容并注明来源。

  2. 如果这篇文章侵犯了您的权益,请在此处或微信公众号留言,我会及时处理。

  3. 如果需要一块探讨,请联系下面微信公众号。



ZWave 中的消息队列机制相关推荐

  1. android消息队列模型,Android 消息队列机制

    在非UI线程使用Handler进行线程通信时,一般都需要进行3个步骤: 创建Looper Looper.prepar() 创建Handler 启动消息循环Looper.loop() 通过这3步,基本就 ...

  2. linux 消息队列机制

    现在我们来讨论第三种也是最后一种System V IPV工具:消息队列.在许多方面看来,消息队列类似于有名管道,但是却没有与打开与关闭管道的复杂关联.然而,使用消息队列并没有解决我们使用有名管道所遇到 ...

  3. android的消息队列机制

    android下的线程,Looper线程,MessageQueue,Handler,Message等之间的关系,以及Message的send/post及Message dispatch的过程. Loo ...

  4. RTOS中的消息队列的原理以及应用

    消息队列的原理 RTOS中的消息队列是一种用于任务间通信的机制,它可以实现任务之间的异步通信,从而实现任务间的解耦.消息队列是一个先进先出的数据结构,任务可以向队列中发送消息,也可以从队列中接收消息. ...

  5. 【Android 异步操作】手写 Handler ( Message 消息 | ThreadLocal 线程本地变量 | Looper 中的消息队列 MessageQueue )

    文章目录 一.Message 消息 二.ThreadLocal 线程本地变量 三.Looper 中的消息队列 MessageQueue 一.Message 消息 模仿 Android 中的 Messa ...

  6. OSSIM中分布式消息队列应用

     OSSIM中分布式消息队列应用 1. 消息队列处理 企业日志数量正在以指数级形式高速增长,日志数据的具有海量.多样.异构等特点,基于传统的单一节点混合式安装的OSSIM平台(指OSSIM 4.4及以 ...

  7. python队列来做什么_python分布式爬虫中的消息队列是什么?

    当排队等待人数过多的时候,我们需要设置一个等待区防止秩序混乱,同时再有新来的想要排队也可以呆在这个地方.那么在python分布式爬虫中,消息队列就相当于这样的一个区域,爬虫要进入这个区域找寻自己想要的 ...

  8. GaussDB(DWS)中共享消息队列实现的三大功能

    摘要:本文将详细介绍GaussDB(DWS)中共享消息队列的实现. 本文分享自华为云社区<GaussDB(DWS)CBB组件之共享消息队列介绍>,作者:疯狂朔朔. 1)共享消息队列是什么? ...

  9. 智能家居DIY连载教程(2)——在实际项目中运用消息队列与邮箱

    前言 千呼万唤始出来,智能家居 DIY 教程连载第二篇终于登场了!本文将重点给大家介绍如何将消息队列与邮箱运用到实际项目中去.一起来看看吧~ DIY 回顾上期: 1.智能家居DIY连载教程(1)--如 ...

最新文章

  1. 芝麻HTTP:Scrapy-Splash的安装
  2. [转载] 信息系统项目管理挂靠合同(协议)范例2
  3. 华月互网获得2012全国十大IDC服务商
  4. 畅想(2)-计算机发展与教育的关系
  5. 员工邮箱能收不能发的解决方法
  6. 【转】Android bluetooth介绍(三): 蓝牙扫描(scan)设备分析
  7. 设计模式--建造者模式(C++实现)
  8. 《深入理解java虚拟机》 - 需要一本书来融汇贯通你的经验(下)
  9. 免费下载pro puppet 2高清pdf,需要的抓紧
  10. 艾伟:用 C# 实现带键值的优先队列
  11. WinMap+ | 稳马企业金服基于C4B理论的绿色金融生态区块链探索
  12. 康泰克音源采样器完整版-Native Instruments Kontakt 6.5.3 WiN-MAC
  13. 如何写期刊论文的文献综述
  14. 大端与小端的区别 之小端
  15. 小卡与质数2全网最简单思路 看不懂你来打我
  16. Java入门需要了解(面向对象之接口-十四)
  17. 宝塔自助建站程序源码 网站建设公司必备程序
  18. 【蓝桥杯算法模板题--蓝桥题库Java】
  19. 【34. 完全背包】
  20. 帝国cms小程序端源码

热门文章

  1. mysql 怎么统计年龄段_mysql统计年龄段分布
  2. 【tips】青甘大环线收获
  3. Gamma分布,Beta分布,多项式分布,Dirichlet狄利克雷分布
  4. 校园网-校园网wifi-校园网免认证教程
  5. 关于Idea上面Resin部署的问题
  6. 51nod 1266 蚂蚁
  7. 51Nod - 1266 蚂蚁
  8. MaixSense R329板开箱 - 音频视频测试
  9. 收银系统服务器有哪些,收银系统有哪些,国产收银系统十大排名
  10. 软考各科目考核内容详细介绍,看这里