ue4的多线程如何实现

1.新建一个FunctionLibrary 在里编写三个函数,并且在cpp里面加以实现;

/////////=================.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include "Kismet/BlueprintFunctionLibrary.h"
#include "MyBlueprintFunctionLibrary.generated.h"
/**
 *
 */
UCLASS()
class MULTITHREADTEST_API UMyBlueprintFunctionLibrary : public UBlueprintFunctionLibrary
{
       GENERATED_BODY()
public:
              UFUNCTION(BlueprintCallable, Category = "MultiThreadTest")
              static void MultiThreadDo(int32 MaxPrime);//多线程处理,参数用于计算质数
              UFUNCTION(BlueprintCallable, Category = "MultiThreadTest")
              static void SingleThreadDo(int32 MaxPrime);//单线程处理,参数用于计算质数
              static void Do(int32 MaxPrime);//处理调用,参数用于计算质数
};
/////////=================.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "MyBlueprintFunctionLibrary.h"
void UMyBlueprintFunctionLibrary::MultiThreadDo(int32 MaxPrime)
{
}
void UMyBlueprintFunctionLibrary::SingleThreadDo(int32 MaxPrime)
{
}
void UMyBlueprintFunctionLibrary::Do(int32 MaxPrime)
{

}

 2.再创建一个空类;

/////////=================.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
/**
 *
 */
class MULTITHREADTEST_API MyTaskClass
{
public:
       MyTaskClass();
       ~MyTaskClass();

};
/////////=================.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "MyTaskClass.h"
MyTaskClass::MyTaskClass()
{
}
MyTaskClass::~MyTaskClass()
{

}

 改写该类

/////////=================.h
// Fill out your copyright notice in the Description page of Project Settings.
#pragma once
#include "CoreMinimal.h"
#include <Runtime/Core/Public/Async/AsyncWork.h>
/**
 *
 */
class MULTITHREADTEST_API MyTaskClass :public FNonAbandonableTask
{
public:
       MyTaskClass();
       ~MyTaskClass();
       //该类必须要有的一个函数,用于生成标注生成线程的信息
       FORCEINLINE TStatId GetStatId() const
       {
              RETURN_QUICK_DECLARE_CYCLE_STAT(PrimeCalculationAsyncTask, STATGROUP_ThreadPoolAsyncTasks);
       }
       void DoWork();//该方法继承与父类,在生成线程时会调用该方法进行执行任务
       int32 MaxPrime;//由于该方法不是静态方法,所以必须在生成该类的时候赋给我们需要的进行计算的值
       MyTaskClass(int32 MaxPrime);//补充一个构造函数用于赋值
};
/////////=================.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "MyTaskClass.h"
MyTaskClass::MyTaskClass()
{
}
MyTaskClass::~MyTaskClass()
{
}
void MyTaskClass::DoWork()
{
}
MyTaskClass::MyTaskClass(int32 MaxPrime)
{
       this->MaxPrime = MaxPrime;
}

对functionlibrary进行补充,只在cpp文件进行改动

/////////=================.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "MyBlueprintFunctionLibrary.h"
#include "MyTaskClass.h"
void UMyBlueprintFunctionLibrary::MultiThreadDo(int32 MaxPrime)
{
       /*开启线程*/
       auto task = new FAutoDeleteAsyncTask<MyTaskClass>(MaxPrime);
       if (task)
              task->StartBackgroundTask();
       //通过阅读源码得知,该方式启用task,会自动新建一个线程,并且调用该类的dowork函数
}
void UMyBlueprintFunctionLibrary::SingleThreadDo(int32 MaxPrime)
{
       Do(MaxPrime);
}
void UMyBlueprintFunctionLibrary::Do(int32 MaxPrime)
{
       //Calculating the prime numbers...
       for (int32 i = 1; i <= MaxPrime; i++)
       {
              bool isPrime = true;
              for (int32 j = 2; j <= i / 2; j++)
              {
                     if (FMath::Fmod(i, j) == 0)
                     {
                           isPrime = false;
                           break;
                     }
              }
              if (isPrime)
                     GLog->Log("Prime number #" + FString::FromInt(i) + ": " + FString::FromInt(i));
       }
}

对task进行补充,只在cpp文件进行改动

/////////=================.cpp
// Fill out your copyright notice in the Description page of Project Settings.
#include "MyTaskClass.h"
#include "MyBlueprintFunctionLibrary.h"
MyTaskClass::MyTaskClass()
{
}
MyTaskClass::~MyTaskClass()
{
}
void MyTaskClass::DoWork()
{
       UMyBlueprintFunctionLibrary::Do(MaxPrime);
}
MyTaskClass::MyTaskClass(int32 MaxPrime)
{
       this->MaxPrime = MaxPrime;

编译后 测试:

å¨è¿éæå¥å¾çæè¿°

测试表明两者的差别主要是没有开启线程的程序,在程序运行时占用主线程导致主线程卡顿;

发布了57 篇原创文章 · 获赞 11 · 访问量 8864

猜你喜欢

转载自blog.csdn.net/o0pk2008/article/details/104670179