UnReal中建立線程

在 .h 文件中添加如下內容


在 .cpp文件中添加如下內容

MultiThreading* MultiThreading::Runnable = NULL;
MultiThreading::MultiThreading(float& EyePoint_X, float& EyePoint_Y, int& EyePoint_C)
{
	//Link to where data should be stored	
	a = &EyePoint_X;
	b = &EyePoint_Y;
	c = &EyePoint_C;

	Thread = FRunnableThread::Create(this, TEXT("FEyeTracking"), 0, TPri_BelowNormal); //windows default = 8mb for thread, could specify more
}

MultiThreading::~MultiThreading()
{
	delete Thread;
	Thread = NULL;
}

bool MultiThreading::Init()
{
	//Init the Data 
	
	if (successed)
	{		
		return true;		
	}
	return false;
}

uint32 MultiThreading::Run()
{
	//Initial wait before starting
	FPlatformProcess::Sleep(0.03);
	
	GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Yellow, FString::Printf(TEXT("執行需要的程序! %d"), cc));	

	return 1;
}

void MultiThreading::Stop()
{
	StopTaskCounter.Increment();
}

MultiThreading* MultiThreading::JoyInit(float& aa, float& bb, int& cc)
{
	if (!Runnable && FPlatformProcess::SupportsMultithreading())
	{
		Runnable = new MultiThreading(a, b, c);
	}
	return Runnable;
}

void MultiThreading::EnsureCompletion()
{
	Stop();
	Thread->WaitForCompletion();
}

void MultiThreading::Shutdown()
{
	if (Runnable)
	{
		Runnable->EnsureCompletion();
		delete Runnable;
		Runnable = NULL;
	}
}

bool MultiThreading::IsThreadFinished()
{
	if (Runnable) return Runnable->IsFinished();
	return true;
}FEyeTrackingWorker* FEyeTrackingWorker::Runnable = NULL;
FEyeTrackingWorker::FEyeTrackingWorker(float& EyePoint_X, float& EyePoint_Y, int& EyePoint_C)
{
	//Link to where data should be stored	
	aa = &EyePoint_X;
	bb = &EyePoint_Y;
	cc = &EyePoint_C;

	Thread = FRunnableThread::Create(this, TEXT("FEyeTracking"), 0, TPri_BelowNormal); //windows default = 8mb for thread, could specify more
}

FEyeTrackingWorker::~FEyeTrackingWorker()
{
	delete Thread;
	Thread = NULL;
}

bool FEyeTrackingWorker::Init()
{
	//Init the Data 
	HINSTANCE hDllInst = NULL;
	FString funcname = "gazeCalculation";

	hDllInst = LoadLibrary(TEXT("D:/sunjiankang/UE/dll/CreateAndLinkDLLTutSol - sjk/x64/Debug/CreateAndLinkDLLTut.dll"));
	if (hDllInst)
	{
		GazeFromDll = (GazeFunc)FPlatformProcess::GetDllExport(hDllInst, *funcname);
		if (GazeFromDll)
		{
			return true;
		}
	}
	return false;
}

uint32 FEyeTrackingWorker::Run()
{
	//Initial wait before starting
	FPlatformProcess::Sleep(0.03);

	GazeFromDll(aa, bb, cc);
	//GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Yellow, FString::Printf(TEXT("GazeFromDll! %d"), cc));	

	return 1;
}

void FEyeTrackingWorker::Stop()
{
	StopTaskCounter.Increment();
}

FEyeTrackingWorker* FEyeTrackingWorker::JoyInit(float& aa, float& bb, int& cc)
{
	if (!Runnable && FPlatformProcess::SupportsMultithreading())
	{
		Runnable = new FEyeTrackingWorker(aa, bb, cc);
	}
	return Runnable;
}

void FEyeTrackingWorker::EnsureCompletion()
{
	Stop();
	Thread->WaitForCompletion();
}

void FEyeTrackingWorker::Shutdown()
{
	if (Runnable)
	{
		Runnable->EnsureCompletion();
		delete Runnable;
		Runnable = NULL;
	}
}

bool FEyeTrackingWorker::IsThreadFinished()
{
	if (Runnable) return Runnable->IsFinished();
	return true;
}empty

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章