64 lines
1.3 KiB
C++
64 lines
1.3 KiB
C++
|
|
#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);
|
||
|
|
}
|