基于c++11的event-driven library的理解

 更新时间:2020年02月12日 16:00:52   作者:p__n  
这篇文章主要介绍了基于c++11的event-driven library的理解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

做了一个不到200行的事件驱动库,基于c++11标准,header-only,跨平台。支持自定义事件,通过wake_up函数异步唤醒。写这个库的动机是想为之前自己写的日志库提供日志回滚机制。

github:https://github.com/chloro-pn/event_pool

event_pool

基本介绍

a header-only event-driven library based on c++11.

一个基于c++11标准,仅需要头文件的事件驱动库:)。

使用方法:

创建event_pool对象并申请一个线程做事件处理,在该线程中调用run函数。

  //run the event_pool.
  std::shared_ptr<event_pool> ev(new event_pool());
  std::thread th([=]()->void {
    ev->run();
  });

创建event_handle和time_handle对象并设置id_,type_,回调函数func_,上下文args_(如果是time_handle则还要设置触发时间)等,push进event_pool对象。

  //create time_handle.
  std::shared_ptr<time_handle> h(new time_handle());
  h->id_ = "timer test ";
  h->type_ = time_handle::type::duration;
  h->duration_ = seconds(2);
  h->args_ = nullptr;
  h->func_ = [](std::shared_ptr<time_handle> self)->void {
      std::cout << self->id_ << " wake up !" << std::endl;
  };
  //create event_handle.
  std::shared_ptr<event_handle> eh(new event_handle());
  eh->id_ = "back cout ";
  eh->type_ = event_handle::type::every;
  eh->args_ = nullptr;
  eh->func_ = [](std::shared_ptr<event_handle> self)->void {
    std::cout << self->id_ << " wake up !"<<std::endl;
  };
  //push them into ev.
  ev->push_timer(h);
  ev->push_event(eh);

在需要触发事件的时候调用wake_up函数(time_handle没有wake_up函数,等待时间到达自动触发)。当需要关闭event_pool时,调用stop函数,然后回收线程,没有来得及处理的事件会被丢弃,即使当event_pool 对象完全销毁后,仍然可以调用wake_up函数,此时会直接返回。

   while (true) {
    char buf[1024];
    gets(buf);
    if (buf[0] == 'q') {
     ev->stop(); // stop the event_pool.
     break;
    }
    eh->wake_up();
   }
   th.join();

使用指南:

  1. 所有对象均需使用std::shared_ptr创建。
  2. 每个time_handle对象和event_handle对象只能push进一个event_pool对象。
  3. event_handle对象可设置两种类型:every和once,every类型允许不限次数的wake_up,event_pool会处理每次wake_up,而once类型只能被唤醒一次,但允许多次调用wake_up函数(线程安全),这意味着可以在多个线程并发的触发事件。
  4. time_handle对象可设置两种类型:duration和time_point,其中duration类型通过设置duration_成员来指定从此刻开始,每间隔多少时间就触发一次。time_point类型通过设置time_point_成员来指定在哪个时刻仅触发一次。
  5. 回调函数的输入参数就是该事件对象本身,你可以通过其访问设置的id_,type_,args_等等。
  6. event_pool的run函数可以在多个线程并发执行(maybe?),这一点暂且不保证。

特点:

1.轻量级,200行源代码,语言层面的跨平台,基于c++11标准。

2.仅需要头文件,即拿即用。

todo:

  • 定义更便于使用,减少出错概率的接口。
  • 补充测试。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • 详解C语言编程中的函数指针以及函数回调

    详解C语言编程中的函数指针以及函数回调

    这篇文章主要介绍了C语言编程中的函数指针以及函数回调,函数回调实际上就是让函数指针作函数参数、调用时传入函数地址,需要的朋友可以参考下
    2016-04-04
  • C++ AVLTree高度平衡的二叉搜索树深入分析

    C++ AVLTree高度平衡的二叉搜索树深入分析

    这篇文章主要介绍了C++ AVLTree高度平衡的二叉搜索树,二叉搜索树虽可以缩短查找的效率,但如果数据有序或接近有序二叉搜索树将退化为单支树,查找元素相当于在顺序表中搜索元素,效率低下
    2023-03-03
  • C++中CString string char* char 之间的字符转换(多种方法)

    C++中CString string char* char 之间的字符转换(多种方法)

    在写程序的时候,我们经常遇到各种各样的类型转换,比如 char* CString string 之间的互相转换,这里简单为大家介绍一下,需要的朋友可以参考下
    2017-09-09
  • C语言算法打卡回文串验证算法题解

    C语言算法打卡回文串验证算法题解

    这篇文章主要为大家介绍了C语言算法打卡万人千提的leetcode回文串的验证算法题解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步
    2022-02-02
  • C语言字符串快速压缩算法代码

    C语言字符串快速压缩算法代码

    这篇文章主要介绍了C语言字符串快速压缩算法代码,将字符串中连续出席的重复字母进行压缩,其主要的压缩字段的格式为”字符重复的次数+字符”。有需要的小伙伴参考下吧。
    2015-03-03
  • C语言库函数strcpy的使用及模拟实现

    C语言库函数strcpy的使用及模拟实现

    本文主要介绍了C语言库函数strcpy的使用及模拟实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2024-04-04
  • C++多线程中的锁和条件变量使用教程

    C++多线程中的锁和条件变量使用教程

    这篇文章主要介绍了C++多线程中的锁和条件变量使用,非常不错,具有一定的参考借鉴价值,需要的朋友可以参考下
    2018-11-11
  • C++未定义行为(undefined behavior)

    C++未定义行为(undefined behavior)

    对于未定义行为,C++标准没有明确规定编译器们应该怎么做,那么执行的结果就是不可预料的。下面我们来详细探讨下
    2017-02-02
  • C++基于QWidget和QLabel实现图片缩放,拉伸与拖拽

    C++基于QWidget和QLabel实现图片缩放,拉伸与拖拽

    这篇文章主要为大家详细介绍了C++如何基于QWidget和QLabel实现图片缩放、拉伸与拖拽等功能,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下
    2024-02-02
  • C语言PlaySound函数使用方法

    C语言PlaySound函数使用方法

    这篇文章介绍了C语言PlaySound函数的使用方法,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-12-12

最新评论