#创作者激励#消息通知之消息投递与处理 原创
【本文正在参加2023年第一期优质创作者激励计划】
前言
通过前面两篇的消息通知的文章,我们已经了解到系统层事件发布和消息订阅相关处理机制,从整体上掌握了消息发布与订阅的基本轮廓,在事件发布和消息订阅的处理流程中我们经常可以看到消息投递处理过程中使用handler_->PostTask进行消息投递,这篇文章我们在OpenHarmony 3.1Release代码基础上深入的分析PostTask动作,了解投递与处理流程,补全OpenHarmony消息通知的整体知识地图与流程地图。消息投递与处理包括三个部分消息事件的初始化、消息事件的投递与消息事件的处理。下面我们来详细介绍相关处理细节,经过这篇文章的学习,能够更加深入的理解消息通知这块的功能。
结构图
我们从整体上把握消息投递与处理框架,主要的类调用关系为CommonEventManagerService-> EventRunner-> EventRunnerImpl-> EventQueue-> EventHandler,所有的消息投递与处理在这几个类中传递,只要把握住这几个类,我们就能梳理清楚消息投递与处理的基本流程。下面我们就看一下消息详细处理细节。
代码流程
1、handler事件句柄的初始化与EventRunner线程的创建
CommonEventManagerService::Init函数中首先创建EventRunner得到runner_,然后通过runner_生成handler_
EventRunner::Create实现细节,如果是新加线程直接调用create函数创建线程,否则将原来加入事件运行队列中。
创建新线程过程中,首先初始化事件队列,然后将事件加入到事件运行队列中,最后调用运行线程
EventRunnerImpl的具体实现ThreadMain中首先获取锁,然后调用run函数循环处理消息通知事件
2、消息事件的投递
消息订阅的使用过程中,首先std::bind事件绑定订阅函数,然后说使用PostTask函数进行消息投递。
消息投递函数PostTask直接调用SendEvent函数进行事件发送。
SendEvent函数,将消息通知事件插入到事件运行队列中。
插入消息通知到事件队列的具体实现,根据传入参数的优先级调用InsertEventsLocked函数
调用InsertEventsLocked函数将消息通知插入到事件队列中
3、事件处理
循环处理消息通知,从事件队列中获取相应的事件进行处理,并调用DistributeEvent函数进行事件分发。
DistributeEvent函数中进行消息通知事件的处理。
以上就是整个消息的投递与处理流程,希望对大家有所帮助。
附件中的大图展示的很清晰