ue4的多线程如何实现

41 篇文章 3 订阅

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;

编译后 测试:

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

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

自己在使用时候要注意 GLog函数会阻塞主线程,因为它还是在主线程中运行的;

 

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值