#include "TriggeredTask.h" FTriggeredTask::FTriggeredTask() { Client = nullptr; Thread = nullptr; ThreadStopRequested = false; CallEvent = nullptr; ReturnEvent = nullptr; } uint32 FTriggeredTask::Run() { while (true) { CallEvent->Wait(); if (ThreadStopRequested) { break; } // The payload. Client->Run(); ReturnEvent->Trigger(); } return 0; } void FTriggeredTask::Startup(FRunnable *client) { FScopeLock lock(&Mutex); if (Thread == nullptr) { Client = client; CallEvent = FPlatformProcess::GetSynchEventFromPool(true); ReturnEvent = FPlatformProcess::GetSynchEventFromPool(false); ReturnEvent->Trigger(); Thread = FRunnableThread::Create(this, TEXT("Worker Thread")); } } void FTriggeredTask::Shutdown() { FScopeLock lock(&Mutex); if (Thread != nullptr) { ReturnEvent->Wait(); ThreadStopRequested = true; CallEvent->Trigger(); delete Thread; // This waits for the thread to complete. Thread = nullptr; FPlatformProcess::ReturnSynchEventToPool(CallEvent); FPlatformProcess::ReturnSynchEventToPool(ReturnEvent); CallEvent = nullptr; ReturnEvent = nullptr; } ThreadStopRequested = false; } void FTriggeredTask::Trigger() { FScopeLock lock(&Mutex); if (Thread != nullptr) { ReturnEvent->Reset(); CallEvent->Trigger(); } } void FTriggeredTask::Wait() { FScopeLock lock(&Mutex); if (Thread != nullptr) { ReturnEvent->Wait(); } } bool FTriggeredTask::IsRunning() { FScopeLock lock(&Mutex); return (Thread != nullptr); }