#include "TriggeredTask.h" #include "DebugPrint.h" using namespace DebugPrint; FTriggeredTask::FTriggeredTask() { Client = nullptr; Thread = nullptr; ThreadStopRequested = false; ThreadEvent = nullptr; } uint32 FTriggeredTask::Run() { while (true) { bool triggered = ThreadEvent->Wait(3000); if (ThreadStopRequested) { DPrint("Thread stopping as requested"); break; } if (!triggered) { DPrint("Thread waiting a long time..."); continue; } // The payload. Client->Run(); } return 0; } void FTriggeredTask::Startup(FRunnable *client) { FScopeLock lock(&Mutex); if (Thread == nullptr) { Client = client; ThreadEvent = FPlatformProcess::GetSynchEventFromPool(false); Thread = FRunnableThread::Create(this, TEXT("Worker Thread")); } } void FTriggeredTask::Shutdown() { FScopeLock lock(&Mutex); if (Thread != nullptr) { ThreadStopRequested = true; ThreadEvent->Trigger(); delete Thread; // This waits for the thread to complete. Thread = nullptr; FPlatformProcess::ReturnSynchEventToPool(ThreadEvent); ThreadEvent = nullptr; } ThreadStopRequested = false; } void FTriggeredTask::Trigger() { FScopeLock lock(&Mutex); if (Thread != nullptr) { ThreadEvent->Trigger(); } } bool FTriggeredTask::IsRunning() { FScopeLock lock(&Mutex); return (Thread != nullptr); }