More work on tangibleCharacter, especially thread synch stuff
This commit is contained in:
@@ -7,23 +7,21 @@ FTriggeredTask::FTriggeredTask() {
|
||||
Client = nullptr;
|
||||
Thread = nullptr;
|
||||
ThreadStopRequested = false;
|
||||
ThreadEvent = nullptr;
|
||||
CallEvent = nullptr;
|
||||
ReturnEvent = nullptr;
|
||||
}
|
||||
|
||||
uint32 FTriggeredTask::Run() {
|
||||
while (true)
|
||||
{
|
||||
bool triggered = ThreadEvent->Wait(3000);
|
||||
CallEvent->Wait();
|
||||
if (ThreadStopRequested) {
|
||||
DPrint("Thread stopping as requested");
|
||||
break;
|
||||
}
|
||||
if (!triggered) {
|
||||
DPrint("Thread waiting a long time...");
|
||||
continue;
|
||||
}
|
||||
// The payload.
|
||||
Client->Run();
|
||||
ReturnEvent->Trigger();
|
||||
}
|
||||
return 0;
|
||||
}
|
||||
@@ -32,7 +30,9 @@ void FTriggeredTask::Startup(FRunnable *client) {
|
||||
FScopeLock lock(&Mutex);
|
||||
if (Thread == nullptr) {
|
||||
Client = client;
|
||||
ThreadEvent = FPlatformProcess::GetSynchEventFromPool(false);
|
||||
CallEvent = FPlatformProcess::GetSynchEventFromPool(true);
|
||||
ReturnEvent = FPlatformProcess::GetSynchEventFromPool(false);
|
||||
ReturnEvent->Trigger();
|
||||
Thread = FRunnableThread::Create(this, TEXT("Worker Thread"));
|
||||
}
|
||||
}
|
||||
@@ -40,12 +40,15 @@ void FTriggeredTask::Startup(FRunnable *client) {
|
||||
void FTriggeredTask::Shutdown() {
|
||||
FScopeLock lock(&Mutex);
|
||||
if (Thread != nullptr) {
|
||||
ReturnEvent->Wait();
|
||||
ThreadStopRequested = true;
|
||||
ThreadEvent->Trigger();
|
||||
CallEvent->Trigger();
|
||||
delete Thread; // This waits for the thread to complete.
|
||||
Thread = nullptr;
|
||||
FPlatformProcess::ReturnSynchEventToPool(ThreadEvent);
|
||||
ThreadEvent = nullptr;
|
||||
FPlatformProcess::ReturnSynchEventToPool(CallEvent);
|
||||
FPlatformProcess::ReturnSynchEventToPool(ReturnEvent);
|
||||
CallEvent = nullptr;
|
||||
ReturnEvent = nullptr;
|
||||
}
|
||||
ThreadStopRequested = false;
|
||||
}
|
||||
@@ -53,7 +56,15 @@ void FTriggeredTask::Shutdown() {
|
||||
void FTriggeredTask::Trigger() {
|
||||
FScopeLock lock(&Mutex);
|
||||
if (Thread != nullptr) {
|
||||
ThreadEvent->Trigger();
|
||||
ReturnEvent->Reset();
|
||||
CallEvent->Trigger();
|
||||
}
|
||||
}
|
||||
|
||||
void FTriggeredTask::Wait() {
|
||||
FScopeLock lock(&Mutex);
|
||||
if (Thread != nullptr) {
|
||||
ReturnEvent->Wait();
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
Reference in New Issue
Block a user