Skip to content
Snippets Groups Projects
Select Git revision
  • 067a2e94408a28819f54881ba35a313a448d8873
  • main default protected
  • master
3 results

FMagicWandSelectionTask.h

Blame
  • 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;
    		}
    	}
    };