1. 程式人生 > >介紹一下eventpp,我的開源C++ 事件派發和回撥程式碼庫

介紹一下eventpp,我的開源C++ 事件派發和回撥程式碼庫

我(wqking)開發,使用標準C++11規範。

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++編寫。

Version:0.1.0 License:Apache License  Version 2.0 GitHub:https://github.com/wqking/eventpp

使用 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();