用户程序框架之线程间通信EventHandler 原创 精华
用户程序框架之线程间通信
作者:纪春祥
概述
应用在运行过程中,经常会有一些耗时较长的任务需要完成,并且不阻塞当前线程,需要独立于当前线程去执行,鸿蒙并引入EventHandler机制:线程间通信。通过EventRunner创建新线程,将耗时的操作放到新线程上执行。这样既不阻塞原来的线程,任务又可以得到合理的处理。主线程使用EventHandler创建子线程,子线程做耗时的下载图片操作,下载完成后,子线程通过EventHandler通知主线程,主线程再更新UI。
运作机制
EventHandler的运作机制如下图所示:
图1 EventHandler的运作机制
使用EventHandler实现线程间通信的主要流程:
- EventHandler投递具体的InnerEvent事件或者Runnable任务到EventRunner所创建的线程的事件队列。
- EventRunner循环从事件队列中获取InnerEvent事件或者Runnable任务。
- 处理事件或任务:
- 如果EventRunner取出的事件为InnerEvent事件,则触发EventHandler的回调方法并触发EventHandler的处理方法,在新线程上处理该事件。
- 如果EventRunner取出的事件为Runnable任务,则EventRunner直接在新线程上处理Runnable任务。
接口
接口头文件:${OpenHarmony}\foundation\appexecfwk\standard\interfaces\innerkits\libeventhandler\include
实现文件:${OpenHarmony}\foundation\appexecfwk\standard\libs\libeventhandler\src
C++面向对象开发
EventHandler
接口 | 参数 | 返回 | 描述 |
---|---|---|---|
EventHandler | (const std::shared_ptr<EventRunner> &runner = nullptr) | 构造函数,通过EventRunner的引用返回 | |
Current | () | EventHandler | 获取当前线程绑定的EventHandler |
SendEvent | InnerEvent::Pointer &event, int64_t delayTime = 0, Priority priority = Priority::LOW | bool | InnerEvent引用,延期时间,优先级 |
(InnerEvent::Pointer &event, Priority priority) | bool | 立即执行的InnerEvent | |
(uint32_t innerEventId, int64_t param, int64_t delayTime) | bool | ||
(uint32_t innerEventId, int64_t delayTime = 0, Priority priority = Priority::LOW) | bool | ||
(uint32_t innerEventId, Priority priority) | bool | ||
(uint32_t innerEventId, const std::shared_ptr<T> *&*object, int64_t delayTime = 0) | bool | ||
(uint32_t innerEventId, const std::weak_ptr<T> *&*object, int64_t delayTime = 0) | bool | ||
(uint32_t innerEventId, std::unique_ptr<T, D> *&*object, int64_t delayTime = 0) | bool | ||
(uint32_t innerEventId, std::unique_ptr<T, D> *&&*object, int64_t delayTime = 0) | bool | ||
SendImmediateEvent | (InnerEvent::Pointer *&*event) | bool | |
(InnerEvent::Pointer *&&*event) | bool | ||
(uint32_t innerEventId, int64_t param = 0) | bool | ||
(uint32_t innerEventId, const std::shared_ptr<T> *&*object) | bool | ||
(uint32_t innerEventId, const std::weak_ptr<T> *&*object) | bool | ||
(uint32_t innerEventId, std::unique_ptr<T, D> *&*object) | bool | ||
(uint32_t innerEventId, std::unique_ptr<T, D> *&&*object) | bool | ||
SendHighPriorityEvent | (InnerEvent::Pointer *&*event, int64_t delayTime = 0) | bool | |
(InnerEvent::Pointer *&&*event, int64_t delayTime = 0) | bool | ||
(uint32_t innerEventId, int64_t param = 0, int64_t delayTime = 0) | bool | ||
(uint32_t innerEventId, const std::shared_ptr<T> *&*object, int64_t delayTime = 0) | bool | ||
(uint32_t innerEventId, std::unique_ptr<T, D> *&*object, int64_t delayTime = 0) | bool | ||
(uint32_t innerEventId, std::unique_ptr<T, D> *&&*object, int64_t delayTime = 0) | bool | ||
SendTimingEvent | InnerEvent::Pointer &event, int64_t taskTime, Priority priority = Priority::LOW | bool | 指定时间的任务:InnerEvent引用,执行时间,优先级 |
(InnerEvent::Pointer *&&*event, int64_t taskTime, Priority priority) | |||
(InnerEvent::Pointer *&&*event, int64_t taskTime) | |||
(uint32_t innerEventId, int64_t taskTime, int64_t param) | |||
(uint32_t innerEventId, int64_t taskTime, Priority priority) | |||
(uint32_t innerEventId, int64_t taskTime) | |||
uint32_t innerEventId, const std::shared_ptr<T> *&*object, int64_t taskTime, Priority priority = Priority::LOW) | |||
uint32_t innerEventId, const std::weak_ptr<T> *&*object, int64_t taskTime, Priority priority = Priority::LOW) | |||
uint32_t innerEventId, std::unique_ptr<T, D> *&*object, int64_t taskTime, Priority priority = Priority::LOW) | |||
uint32_t innerEventId, std::unique_ptr<T, D> *&&*object, int64_t taskTime, Priority priority = Priority::LOW) | |||
PostTimingTask | (const Callback *&*callback, int64_t taskTime, const std::string *&*name = std::string(), Priority priority = Priority::LOW) | bool | |
(const Callback *&*callback, int64_t taskTime, Priority priority = Priority::LOW) | |||
PostTask | (const Callback *&*callback, const std::string *&*name = std::string(), int64_t delayTime = 0, Priority priority = Priority::LOW) | bool | |
(const Callback *&*callback, Priority priority) | |||
(const Callback *&*callback, int64_t delayTime, Priority priority = Priority::LOW) | |||
PostImmediateTask | (const Callback *&*callback, const std::string *&*name = std::string()) | bool | |
PostHighPriorityTask | (const Callback *&*callback, const std::string *&*name = std::string(), int64_t delayTime = 0) | bool | |
(const Callback *&*callback, int64_t delayTime) | |||
PostIdleTask | (const Callback *&*callback, const std::string *&*name = std::string(), int64_t delayTime = 0) | bool | |
(const Callback *&*callback, int64_t delayTime) | |||
SendSyncEvent | (InnerEvent::Pointer *&*event, Priority priority = Priority::LOW); | bool | |
(InnerEvent::Pointer *&&*event, Priority priority = Priority::LOW) | |||
(uint32_t innerEventId, int64_t param = 0, Priority priority = Priority::LOW) | |||
(uint32_t innerEventId, Priority priority) | |||
(uint32_t* innerEventId, const std::shared_ptr<T> *&*object, Priority priority = Priority::LOW) | |||
(uint32_t innerEventId, const std::weak_ptr<T> *&*object, Priority priority = Priority::LOW) | |||
(uint32_t innerEventId, std::unique_ptr<T, D> *&*object, Priority priority = Priority::LOW) | |||
(uint32_t innerEventId, std::unique_ptr<T, D> *&&*object, Priority priority = Priority::LOW) | |||
PostSyncTask | (const Callback *&*callback, const std::string *&*name, Priority priority = Priority::LOW) | bool | |
(const Callback *&*callback, Priority priority = Priority::LOW) | |||
RemoveAllEvents | bool | ||
RemoveEvent | (uint32_t innerEventId) | bool | |
(uint32_t innerEventId, int64_t param); | bool | ||
RemoveTask | (const std::string *&*name); | bool | |
AddFDListener | int32_t fileDescriptor, uint32_t events, const std::shared_ptr<FileDescriptorListener> *&*listener); | bool | |
RemoveAFDListeners | () | bool | |
RemoveFDListener | (int32_t fileDescriptor) | bool | |
SetEventRunner | (const std::shared_ptr<EventRunner> *&*runner); | void | |
GetEventRunner | EventRunner | ||
DistributeEvent | (const InnerEvent::Pointer *&*event) | bool | |
DistributeTimeAction | (const InnerEvent::Pointer *&*event, InnerEvent::TimePoint nowStart); | bool | |
DeliveryTimeAction | (const InnerEvent::Pointer *&*event, InnerEvent::TimePoint nowStart); | bool | |
Dump | (Dumper *&*dumper) | void | |
HasInnerEvent | (uint32_t innerEventId) | bool | 是否存在内部事件 |
(int64_t param) | |||
GetEventName | (const InnerEvent::Pointer *&*event); | std::string | 获取内部事件名称 |
IsIdle | () | bool | 返回当前EventHandler是非空闲 |
总结:
1、SentEvent:发InnerEvent
PostTask:发RunableTask
2、delayTime:延迟时间,默认为0,立即执行
3、Priority:优先级
// Event that should be distributed at once if possible.
IMMEDIATE = 0,
// High priority event, sorted by handle time, should be distributed before low priority event.
HIGH,
// Normal event, sorted by handle time.
LOW,
// Event that should be distributed only if no other event right now.
IDLE,
4、其他接口多为围绕这些关键点展开,提供更便捷的接口操作
类图
基本流程图时序图
PS:好像叫线程间通信不是太合适,叫线程子任务调度确切些。
参考:https://developer.harmonyos.com/cn/docs/documentation/doc-guides/inter-thread-overview-0000000000038958
更多原创内容请关注:深开鸿技术团队
入门到精通、技巧到案例,系统化分享HarmonyOS开发技术,欢迎投稿和订阅,让我们一起携手前行共建鸿蒙生态。
赞,结合这篇再看文档清晰多了