#pragma once #include NS_BEGIN(Sia) NS_BEGIN(Api) class AFX_EXT_CLASS CEvent { public: virtual ~CEvent() {} public: virtual String GetSingleLineMessage() const = 0; virtual std::shared_ptr Clone() const = 0; }; typedef std::shared_ptr CEventPtr; #define CreateSystemEvent(E) CEventPtr(new E) #define CreateSystemEventConsumer(E) [=](const CEvent&) -> void { E(e); } // Singleton class AFX_EXT_CLASS CEventSystem { private: CEventSystem(); private: ~CEventSystem(); public: // Singleton setup CEventSystem(const CEventSystem&) = delete; CEventSystem(CEventSystem&&) = delete; CEventSystem& operator=(CEventSystem&&) = delete; CEventSystem& operator=(const CEventSystem&) = delete; private: HANDLE _stopEvent; std::deque _eventQueue; std::deque> _eventConsumers; std::mutex _eventMutex; std::unique_ptr _processThread; public: static CEventSystem EventSystem; private: void ProcessEvents(); public: void AddEventConsumer(std::function consumer); void NotifyEvent(CEventPtr eventData); void Start(); void Stop(); }; NS_END(2)