UE4简单的异步线程

1. 创建FNonAbandonableTask配合事件代理

DECLARE_DYNAMIC_DELEGATE_OneParam(FSwitchQGCJoystickDelegate, EJoystick, type);
class TaskExample : public FNonAbandonableTask
{
	//定义需要的属性
	/*Code*/
public:
	FSwitchQGCJoystickDelegate SwitchJoystickDelegate;
	EJoystick Type;

	//构造函数,根据需要初始化数据
	TaskExample(FSwitchQGCJoystickDelegate switchJoystickDelegate, EJoystick type = EJoystick::EJ_FengHuang)
	{
		this->SwitchJoystickDelegate = switchJoystickDelegate;
		this->Type = type;
		/*Code*/
	}

	FORCEINLINE TStatId GetStatId() const
	{
		RETURN_QUICK_DECLARE_CYCLE_STAT(TaskExample, STATGROUP_ThreadPoolAsyncTasks);
	}

	/*需要使用Task完成的任务*/
	void DoWork()
	{
		/*Code*/
        // 调用UI中的函数  必须主线程执行
		AsyncTask(ENamedThreads::GameThread, [&]() {
			/*Code*/
		});
	}
};



调用方式:
//(new FAutoDeleteAsyncTask<TaskExample>())->StartSynchronousTask();

方法2:使用UBlueprintAsyncActionBase

// Fill out your copyright notice in the Description page of Project Settings.

#pragma once

#include "CoreMinimal.h"
#include "Kismet/BlueprintAsyncActionBase.h"
#include "AirsimPx4ConnectBPLibrary.h"
#include "SwitchQgcJoystick.generated.h"


extern enum class EJoystick :uint8;

/**
 * 
 */
UCLASS()
class AIRSIMPX4CONNECT_API USwitchQgcJoystick : public UBlueprintAsyncActionBase
{
	
	GENERATED_BODY()
public:
	DECLARE_DYNAMIC_MULTICAST_DELEGATE_OneParam(FBPPin_Result, EJoystick, JoystickType);
	/** 输出针脚1 */
	UPROPERTY(BlueprintAssignable)
	FBPPin_Result OnComplete;

	EJoystick ActiveJoystickType;

public:
	/** 蓝图节点:负责NewOBject 蓝图节点(创建工厂模式) */
	UFUNCTION(BlueprintCallable, meta = (BlueprintInternalUseOnly = "true", WorldContext = "WorldContextObject", Category = "AirsimPx4Connect"))
		static USwitchQgcJoystick* SwitchQgcJoystickAsync(UObject* WorldContextObject, EJoystick Type = EJoystick::EJ_FengHuang);
protected:
	/** 程序通过(运行)节点是调用 */
	virtual void Activate() override;
};
// Fill out your copyright notice in the Description page of Project Settings.


#include "SwitchQgcJoystick.h"

USwitchQgcJoystick* USwitchQgcJoystick::SwitchQgcJoystickAsync(UObject* WorldContextObject, EJoystick Type)
{
	USwitchQgcJoystick* Ins = NewObject<USwitchQgcJoystick>();
	Ins->ActiveJoystickType = Type;
	return Ins;
}

void USwitchQgcJoystick::Activate()
{
	//测试逻辑----开新线程,延迟一秒后随机调用成功或失败委托
	Async(EAsyncExecution::ThreadPool, [&]()
		{
			FPlatformProcess::Sleep(1.0f);
			// 该动作必须游戏线程中执行
			AsyncTask(ENamedThreads::GameThread, [&]() {
				this->OnComplete.Broadcast(this->ActiveJoystickType);
				});
		});
}

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 2
    评论
在 Unreal Engine 5 中,你可以使用 C++ 来实现异步线程执行。下面是一个简单的示例代码: ```cpp #include "Async/Async.h" // 定义一个异步任务 class MyAsyncTask : public FNonAbandonableTask { public: // 构造函数传入需要执行的参数 MyAsyncTask(int32 InParam) : Param(InParam) {} // 在异步线程中执行的任务 void DoWork() { // 执行一些耗时操作,比如计算或者加载资源等等 // ... // 任务执行结束后可以将结果回调到主线程 FGraphEventRef GameThreadTask = FFunctionGraphTask::CreateAndDispatchWhenReady([&]() { // 在主线程中执行回调操作,可以更新UI或者其他逻辑 // ... }, TStatId(), nullptr, ENamedThreads::GameThread); } // 返回任务名称 static const TCHAR* Name() { return TEXT("MyAsyncTask"); } FORCEINLINE TStatId GetStatId() const { RETURN_QUICK_DECLARE_CYCLE_STAT(MyAsyncTask, STATGROUP_ThreadPoolAsyncTasks); } private: int32 Param; }; // 启动异步任务 void StartAsyncTask(int32 Param) { // 创建异步任务并提交到线程池中执行 MyAsyncTask* AsyncTask = new MyAsyncTask(Param); AsyncTask->StartBackgroundTask(); } ``` 在上面的示例代码中,我们定义了一个名为 `MyAsyncTask` 的异步任务,它继承自 `FNonAbandonableTask`,并实现了 `DoWork` 方法来执行异步线程中的任务。在 `DoWork` 方法中,你可以执行一些耗时操作,并在任务结束后通过 `FFunctionGraphTask` 将结果回调到主线程进行处理。 要启动异步任务,你可以调用 `StartAsyncTask` 函数,并传入需要执行的参数。该函数会创建一个 `MyAsyncTask` 实例,并提交到线程池中执行。 请注意,异步任务的执行是在一个单独的线程中进行的,因此你需要确保在任务中不会访问或修改与主线程共享的对象或数据,以避免潜在的竞态条件。

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值