Unreal5(虚幻五) 使用FRunnable做多线程

蓝图
在这里插入图片描述
当点击按钮时,创建一个LsqAsyncStudyActor,并且绑定到OnAsyncSuccess委托事件,然后调用DoAsync函数。OnAsyncSuccess委托事件是给FRunnable活干完了通知主线程的回调用的。

LsqAsyncStudyActor.h

#pragma once

#include "CoreMinimal.h"
#include "GameFramework/Actor.h"
#include "LsqAsyncStudyActor.generated.h"

UCLASS()
class TESTCLIENT0926_API ALsqAsyncStudyActor : public AActor
{
	GENERATED_BODY()
	
public:	
	DECLARE_DYNAMIC_MULTICAST_DELEGATE(FAsyncSuccessDelegate);

	UFUNCTION(BlueprintCallable, Category = "LsqNet")
	void DoAsync();

	UPROPERTY(BlueprintAssignable)
	FAsyncSuccessDelegate OnAsyncSuccess;

protected:
	class LsqAsyncStudyThread1* MyThread; //使用前向声明法 来解决 头文件循环包含bug
};

LsqAsyncStudyActor.cpp

#include "LsqAsyncStudyActor.h"
#include "LsqAsyncStudyThread1.h"    //使用前向声明法 解决 头文件循环包含bug

void ALsqAsyncStudyActor::DoAsync() {
	// 实例化LsqAsyncStudyThread1对象,并将ALsqAsyncStudyActor对象作为参数传递
	MyThread = new LsqAsyncStudyThread1(this);
	// 启动线程
	FRunnableThread::Create(MyThread, TEXT("LsqAsyncStudyThread1"));
}

在DoAsync里面,先new一个线程对象LsqAsyncStudyThread1,这个线程对象是我自定义的,实现了FRunnable接口的。
然后调用FRunnableThread的Create静态方法启动线程。
为什么要用UE的这套方法来创建线程和启动线程呢?一是使用了UE的跨平台特性,二是由引擎去完成线程的管理细节。

LsqAsyncStudyThread1.h

#pragma once

#include "CoreMinimal.h"
#include "LsqAsyncStudyActor.h"
#include "HAL/Runnable.h"
#include "HAL/RunnableThread.h"

class TESTCLIENT0926_API LsqAsyncStudyThread1:public FRunnable
{
public:
	LsqAsyncStudyThread1(ALsqAsyncStudyActor* InActor);
	~LsqAsyncStudyThread1();
	virtual bool Init() override;
	virtual uint32 Run() override;
	virtual void Stop() override;
	virtual void Exit() override;

private:
	ALsqAsyncStudyActor* MyActor;
};

FRunnable有四大函数

virtual bool Init() override;
virtual uint32 Run() override;
virtual void Stop() override;
virtual void Exit() override;

正常流程下,它会依次执行 Init,Run,Exit三个函数
在Run里面写你需要多线程的业务逻辑。
我这里使用的是 FPlatformProcess::Sleep(5.0f);
让这个线程睡上五秒,模拟费时的操作
在操作完了,我还BroadCast了Actor的完成事件 MyActor->OnAsyncSuccess.Broadcast();
使用UE的委托与事件的方式,通知调用者异步任务已经完成,可以过来取结果了

LsqAsyncStudyThread1.cpp

#include "LsqAsyncStudyThread1.h"

LsqAsyncStudyThread1::LsqAsyncStudyThread1(ALsqAsyncStudyActor* InActor)
{
	GEngine->AddOnScreenDebugMessage(-1, 50.f, FColor::White, "Thread Construct");
	MyActor = InActor;
}

LsqAsyncStudyThread1::~LsqAsyncStudyThread1()
{
	GEngine->AddOnScreenDebugMessage(-1, 50.f, FColor::White, "Thread Destruct");
}
bool LsqAsyncStudyThread1::Init() {
	GEngine->AddOnScreenDebugMessage(-1, 50.f, FColor::White, "Thread Init");
	return true;
}
uint32 LsqAsyncStudyThread1::Run() {
	GEngine->AddOnScreenDebugMessage(-1, 50.f, FColor::White, "Thread Run");
	FPlatformProcess::Sleep(5.0f);
	MyActor->OnAsyncSuccess.Broadcast();
	return 0;
}
void  LsqAsyncStudyThread1::Stop(){
	GEngine->AddOnScreenDebugMessage(-1, 50.f, FColor::White, "Thread Stop");

}

void  LsqAsyncStudyThread1::Exit() {
	GEngine->AddOnScreenDebugMessage(-1, 50.f, FColor::White, "Thread Exit");
}

输出结果:
在这里插入图片描述
如果改一下Exit
void LsqAsyncStudyThread1::Exit() {
GEngine->AddOnScreenDebugMessage(-1, 50.f, FColor::White, “Thread Exit”);
delete this;//在线程结束时销毁对象
}
在这里插入图片描述

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值