Select Git revision
FMagicWandSelectionTask.h
FMagicWandSelectionTask.h 1.65 KiB
#pragma once
#include "CoreMinimal.h"
#include "MagicWand.h"
DECLARE_STATS_GROUP(TEXT("MagicWandTasks"), STATGROUP_MagicWandTasks, STATCAT_Advanced);
class FMagicWandSelectionTask : public FRunnable
{
UMagicWand* MagicWand;
TQueue<int32>* ProcessQueue;
float ProximityThreshold;
int ThreadLoad;
FRunnableThread* Thread = nullptr;
public:
FMagicWandSelectionTask(UMagicWand* InMagicWand, TQueue<int32>* InProcessQueue, const float InProximityThreshold, const int ThreadLoad)
: MagicWand(InMagicWand), ProcessQueue(InProcessQueue), ProximityThreshold(InProximityThreshold), ThreadLoad(ThreadLoad)
{
}
virtual bool Init() override
{
return true;
}
void Start()
{
if (!Thread)
{
Thread = FRunnableThread::Create(this, TEXT("FMagicWandSelectionTask"), 0, TPri_Highest);
}
}
virtual uint32 Run() override
{
MagicWand->ExpandFromAllPointsInQueue(ProcessQueue, ProximityThreshold, ThreadLoad);
delete ProcessQueue; // Ensure resources are freed properly
ProcessQueue = nullptr;
return 0;
}
void DoWork()
{
MagicWand->ExpandFromAllPointsInQueue(ProcessQueue, ProximityThreshold, ThreadLoad);
delete ProcessQueue; // Ensure resources are freed properly
ProcessQueue = nullptr;
}
// Destructor to clean up the queue
virtual ~FMagicWandSelectionTask() override
{
if (ProcessQueue)
{
delete ProcessQueue;
ProcessQueue = nullptr;
}
if (Thread)
{
Thread->Kill(true);
delete Thread;
}
}
void ForceStop()
{
if (ProcessQueue)
{
delete ProcessQueue;
ProcessQueue = nullptr;
}
if (Thread)
{
Thread->Kill(true); // Forcefully terminates the thread
delete Thread;
Thread = nullptr;
}
}
};