2024-01-25 11:21:15 +08:00

56 lines
1.2 KiB
C++

#pragma once
#include "CoreMinimal.h"
#include "Queue.h"
#include "Thread/ThreadMessage.h"
DECLARE_LOG_CATEGORY_EXTERN(SingletonLog, Log, All);
template<class T>
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<FThreadMessage*, EQueueMode::Mpsc> MessageQueue;
};
template<class T>
class TSingleton : public TSingletonImpl<T>, public ISingleton
{
};