#ifndef _EVENTSYSTEM_H #define _EVENTSYSTEM_H #include NS_BEGIN(Sia) NS_BEGIN(Api) class SIADRIVE_EXPORTABLE CEvent { public: virtual ~CEvent() {} public: virtual SString 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 SIADRIVE_EXPORTABLE 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: #ifdef _WIN32 HANDLE _stopEvent; #endif std::deque _eventQueue; std::deque> _eventConsumers; std::deque> _oneShotEventConsumers; std::mutex _eventMutex; std::unique_ptr _processThread; std::mutex _oneShotMutex; public: static CEventSystem EventSystem; private: void ProcessEvents(); public: void AddEventConsumer(std::function consumer); void AddOneShotEventConsumer(std::function consumer); void NotifyEvent(CEventPtr eventData); void Start(); void Stop(); }; NS_END(2) #endif //_EVENTSYSTEM_H