#pragma once namespace Components { class Scheduler : public Component { public: typedef void(Callback)(); Scheduler(); ~Scheduler(); void preDestroy() override; static void OnShutdown(Utils::Slot callback); static void OnFrame(Utils::Slot callback, bool clientOnly = false); static void OnReady(Utils::Slot callback, bool clientOnly = false); static void Once(Utils::Slot callback, bool clientOnly = false); static void OnDelay(Utils::Slot callback, std::chrono::nanoseconds delay, bool clientOnly = false); static void OnFrameAsync(Utils::Slot callback); static void OnceAsync(Utils::Slot callback); static void FrameHandler(); private: class DelayedSlot { public: std::chrono::nanoseconds delay; Utils::Time::Interval interval; Utils::Slot callback; }; static bool AsyncTerminate; static std::thread AsyncThread; static Utils::Signal FrameSignal; static Utils::Signal FrameOnceSignal; static std::vector DelayedSlots; static bool ReadyPassed; static Utils::Signal ReadySignal; static Utils::Signal ShutdownSignal; static Utils::Signal AsyncFrameSignal; static Utils::Signal AsyncFrameOnceSignal; static void ReadyHandler(); static void DelaySignal(); static void ShutdownStub(int num); }; }