eventpp - C++ 事件派发和回调代码库


Apache
跨平台
C/C++

软件简介

eventpp 是一个 C++
事件库,它提供的工具允许应用程序组件通过调度事件并监听它们来相互通信。使用eventpp,您可以非常轻松地实现信号/插槽机制或观察者模式。

特性

  • 支持同步事件调度和异步事件队列。

  • 可配置和可扩展的策略和mixins。

  • 通过mixins支持事件过滤器。

  • 支持嵌套事件。在处理事件期间,侦听器可以安全地调度事件,追加/预置/插入/删除其他侦听器。

  • 线程安全。支持多线程。

  • 异常安全。大多数操作保证强异常安全。

  • 用大量单元测试来保证质量。

  • 速度快。EventQueue可以在1秒内处理10M事件(每毫秒10K事件)。CallbackList可以在1秒内调用100M回调(每毫秒100K回调)。CallbackList可以在1秒内添加/删除5M回调(每毫秒5K回调)。

  • 灵活易用。

  • 侦听器和事件可以是任何类型,不需要从任何基类继承。

  • 纯头文件,没有源文件,无需构建。不依赖于其他库。

  • 需要C++11(使用MSVC 2017,MSVC 2015,MinGW(Msys)gcc 7.2和Ubuntu gcc 5.4测试)。

  • 用可移植的标准的C++编写。

使用 CallbackList

#include "eventpp/callbacklist.h"
eventpp::CallbackList<void (const std::string &, const bool)> callbackList;
callbackList.append([](const std::string & s, const bool b) {
    std::cout << std::boolalpha << "Got callback 1, s is " << s << " b is " << b << std::endl;
});
callbackList.append([](std::string s, int b) {
    std::cout << std::boolalpha << "Got callback 2, s is " << s << " b is " << b << std::endl;
});
callbackList("Hello world", true);

使用 EventDispatcher

#include "eventpp/eventdispatcher.h"
eventpp::EventDispatcher<int, void ()> dispatcher;
dispatcher.appendListener(3, []() {
    std::cout << "Got event 3." << std::endl;
});
dispatcher.appendListener(5, []() {
    std::cout << "Got event 5." << std::endl;
});
dispatcher.appendListener(5, []() {
    std::cout << "Got another event 5." << std::endl;
});
// dispatch event 3
dispatcher.dispatch(3);
// dispatch event 5
dispatcher.dispatch(5);

使用 EventQueue

eventpp::EventQueue<int, void (const std::string &, const bool)> queue;

dispatcher.appendListener(3, [](const std::string s, bool b) {
    std::cout << std::boolalpha << "Got event 3, s is " << s << " b is " << b << std::endl;
});
dispatcher.appendListener(5, [](const std::string s, bool b) {
    std::cout << std::boolalpha << "Got event 5, s is " << s << " b is " << b << std::endl;
});

// The listeners are not triggered during enqueue.
queue.enqueue(3, "Hello", true);
queue.enqueue(5, "World", false);

// Process the event queue, dispatch all queued events.
queue.process();