56 lines
1.2 KiB
C++
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
|
|
{
|
|
|
|
};
|