Files
FlaxEngine/Source/Engine/Threading/MainThreadTask.cpp
Wojciech Figat a7e428a21c Merge branch 'master' into 1.5
# Conflicts:
#	Content/Shaders/GI/DDGI.flax
#	Content/Shaders/GI/GlobalSurfaceAtlas.flax
#	Content/Shaders/TAA.flax
#	Content/Shaders/VolumetricFog.flax
#	Source/Editor/CustomEditors/Editors/ActorTagEditor.cs
#	Source/Engine/Core/Config/GraphicsSettings.cpp
#	Source/Engine/Engine/PostProcessEffect.cs
#	Source/Engine/Graphics/GPUResourcesCollection.cpp
#	Source/Engine/Graphics/GPUResourcesCollection.h
#	Source/Engine/Graphics/PostProcessBase.h
#	Source/FlaxEngine.Gen.cs
2023-01-10 15:37:55 +01:00

69 lines
1.3 KiB
C++

// Copyright (c) 2012-2023 Wojciech Figat. All rights reserved.
#include "MainThreadTask.h"
#include "Engine/Platform/CriticalSection.h"
#include "Engine/Profiler/ProfilerCPU.h"
namespace
{
CriticalSection Locker;
Array<MainThreadTask*> Waiting;
Array<MainThreadTask*> Queue;
}
void MainThreadTask::RunAll(float dt)
{
PROFILE_CPU();
Locker.Lock();
for (int32 i = Waiting.Count() - 1; i >= 0; i--)
{
auto task = Waiting[i];
task->InitialDelay -= dt;
if (task->InitialDelay < ZeroTolerance)
{
Waiting.RemoveAt(i);
Queue.Add(task);
}
}
for (int32 i = 0; i < Queue.Count(); i++)
{
Queue[i]->Execute();
}
Queue.Clear();
Locker.Unlock();
}
String MainThreadTask::ToString() const
{
return String::Format(TEXT("Main Thread Task ({0})"), (int32)GetState());
}
void MainThreadTask::Enqueue()
{
Locker.Lock();
if (InitialDelay <= ZeroTolerance)
Queue.Add(this);
else
Waiting.Add(this);
Locker.Unlock();
}
bool MainThreadActionTask::Run()
{
if (_action1.IsBinded())
{
_action1();
return false;
}
if (_action2.IsBinded())
{
return _action2();
}
return true;
}
bool MainThreadActionTask::HasReference(Object* obj) const
{
return obj == _target;
}