本章节是基于libevent的应用,C++的编程中,如果遇到C接口,我们可以先封装出一个类出来,也就是C转C++的写法。
1 ev_base
ev_base是基于libevent封装了一层C++类接口,源码文件两个:ev_base.h和ev_base.cpp;接口定义如下:
源码其实非常的简单,就是基于libevent实现了定时器和loop,以及接口对资源的管理(内存申请回收等):
- ev_base::ev_base()
- {
- ::signal(SIGPIPE, SIG_IGN);
- this->base_ = event_base_new();
- this->tv_.tv_sec = 0;
- this->tv_.tv_usec = 1000 * 100;
- evtimer_set(&this->evtimer_, ev_base::on_timer, this);
- event_base_set(this->base_, &this->evtimer_);
- evtimer_add(&this->evtimer_, &this->tv_);
- }
- ev_base::~ev_base()
- {
- evtimer_del(&this->evtimer_);
- event_base_free(this->base_);
- }
- void ev_base::loop()
- {
- event_base_dispatch(this->base_);
- }
- void ev_base::on_timer(int fd, short event, void *arg)
- {
- ev_base *self = reinterpret_cast<ev_base *>(arg);
- self->on_ticks();
- evtimer_add(&self->evtimer_, &self->tv_);
- }
event_base_new : 实例化一个base。
event_base_free : 释放实例对象。
event_base_dispatch :分发,进入无限循环,和先前章节中link_loop_forever一致。
evtimer_set : 设置定时器。
event_base_set : 设置实例。
evtimer_add :添加定时器。
evtimer_del :删除定时器。
2 ev_proxy
ev_proxy是对ev_base进一步的封装,ev_base实际上还并不是很清晰,因此实际应用中,我们使用的是ev_proxy对象,而非ev_base,当然两种存在继承关系:
接口非常简单,核心是支持了定时器,源码可以看ev_proxy.cpp,基本逻辑是有一个不断定时循环的函数on_ticks,每隔100ms回调一次,因此我们只需要一个定时器列表记录所有启动的定时器信息,然后不断轮询处理即可。这个定时器列表的支持用了C++标准库的map功能。
3 应用实例
我们的代码结构如下:
实现的功能很简单,启动一个重复运行的定时器,周期1秒:
Makefile比较简单,我们make(大家需要copy到板上)后运行,每秒打印时间戳出来:
============================================================================================================================================================
如果觉得对您有帮助并想进一步深入学习交流可以扫描以下微信二维码或加入QQ群:928840648
欢迎共同学习成长,有一群爱学习的小伙伴一起勉励!!一起加油!!也可点击
笔者基于嵌入式系统框架内容如下整理编辑: