#pragma once #include "CoreMinimal.h" #include "Queue.h" #include "Thread/ThreadMessage.h" DECLARE_LOG_CATEGORY_EXTERN(SingletonLog, Log, All); template class TSingletonImpl { public: static T& Get() { static T Instance; return Instance; } }; class ISingleton { public: virtual ~ISingleton() = default; virtual void Init() {} virtual void PostInit() {} virtual void BeginRelease() {} virtual void Release() {} void ProcessMessage() { while (!MessageQueue.IsEmpty()) { FThreadMessage* Message = nullptr; MessageQueue.Dequeue(Message); UE_LOG(SingletonLog, Log, TEXT("%s: Processing message %s"), *GetName().ToString(), *Message->GetName().ToString()); Message->Do(); FreeMessage(Message); } } virtual void PushMessage(FThreadMessage* Data) { UE_LOG(SingletonLog, Log, TEXT("%s: Pushing message %s"), *GetName().ToString(), *Data->GetName().ToString()); MessageQueue.Enqueue(Data); } virtual void FreeMessage(FThreadMessage* Data) { delete Data; } virtual FName GetName() { return "ISingleton"; } private: TQueue MessageQueue; }; template class TSingleton : public TSingletonImpl, public ISingleton { };