#pragma once #include #include #include #include #include #include #include #include #include namespace NBus { namespace NPrivate { class IScheduleItem { public: inline IScheduleItem(TInstant scheduleTime) noexcept; virtual ~IScheduleItem() { } virtual void Do() = 0; inline TInstant GetScheduleTime() const noexcept; private: TInstant ScheduleTime; }; using IScheduleItemAutoPtr = TAutoPtr; class TScheduler { public: TScheduler(); ~TScheduler(); void Stop(); void Schedule(TAutoPtr i); size_t Size() const; private: void SchedulerThread(); void FillNextItem(); private: TVector Items; IScheduleItemAutoPtr NextItem; typedef TMutex TLock; TLock Lock; TCondVar CondVar; TObjectCounter ObjectCounter; bool StopThread; NThreading::TLegacyFuture<> Thread; }; inline IScheduleItem::IScheduleItem(TInstant scheduleTime) noexcept : ScheduleTime(scheduleTime) { } inline TInstant IScheduleItem::GetScheduleTime() const noexcept { return ScheduleTime; } } }