虚幻官方文档:https://docs.unrealengine.com/5.0/en-US/API/Runtime/Core/HAL/FRunnable/

FRunnable

  • “runnable”对象的接口。
  • 可运行对象是在任意线程上“运行”的对象。调用使用模式是Init()、Run()、Exit()。将要“run”这个对象的线程总是使用那些调用语义。它在创建的线程上执行此操作,以便在这些调用的上下文中可以使用任何特定于线程的使用(TLS等)。“runnable”在Init()中完成所有的初始化。
  • 如果初始化失败,线程将停止执行并返回错误代码。如果成功,则在执行真正的线程工作的地方调用Run()。完成后,调用Exit()以允许正确的清理。

 函数

  • void Exit() 退出可运行对象
  • bool Init()  初始化可运行对象。
  • uint32  Run()  运行可运行对象。
  • void Stop() 停止可运行对象。如果请求线程提前终止,则调用此函数。
  • FSingleThreadRunnable GetSingleThreadInterface() 获取在禁用多线程时用于勾选此可运行项的单线程接口指针。

代码流程示意:

自定义基于Runnable的类

// 头文件
#pragma once #include "HAL/Runnable.h"
#include "CoreMinimal.h" /**
*
*/
class MX_API FTestRunnable:public FRunnable
{
public:
FTestRunnable(FString ThreadName,class AActor1* a1) :MyThreadName(ThreadName), A1(a1) {};
virtual bool Init() override;
virtual uint32 Run() override;
virtual void Exit() override; FString MyThreadName;
class AActor1* A1;
protected:
int32 RunCount = 0;
static FCriticalSection CriticalSection;
};
// 源文件
FCriticalSection FTestRunnable::CriticalSection; bool FTestRunnable::Init()
{
UE_LOG(LogTemp, Log, TEXT("%s 初始化!"), *MyThreadName);
//GEngine->AddOnScreenDebugMessage(-1, 20, FColor::Red, TEXT("%s 初始化!"), *MyThreadName);
return IsValid(A1);
} uint32 FTestRunnable::Run()
{
while (IsValid(A1))
{
// 同步锁 如果没有这行代码 最终各个线程运行的总次数将会大于需要的次数
FScopeLock Lock(&CriticalSection);
if (A1->TestCount < A1->TestTarget)
{
A1->TestCount++;
RunCount++;
// 节约资源 每100次打印一次
if (RunCount % 100 == 0)
UE_LOG(LogTemp, Log, TEXT("%s %d"), *MyThreadName, RunCount);
}
else{break;}
}
return 0;
}
void FTestRunnable::Exit()
{
UE_LOG(LogTemp, Log, TEXT("%s 结束运行!执行次数:%d"), *MyThreadName, RunCount);
}

执行线程的类:

// 头文件
// 定义两个变量用于计数
int32 TestCount; UPROPERTY(EditAnywhere)
int32 TestTarget;
// 源文件 用于创建和开启线程 这里我放在了BeginPlay中方便测试
FTestRunnable* Runnable1 = new FTestRunnable(TEXT("线程1"), this);
FTestRunnable* Runnable2 = new FTestRunnable(TEXT("线程2"), this);
FTestRunnable* Runnable3 = new FTestRunnable(TEXT("线程3"), this);
FRunnableThread* RunnableThread1 = FRunnableThread::Create(Runnable1, *Runnable1->MyThreadName);
FRunnableThread* RunnableThread2 = FRunnableThread::Create(Runnable2, *Runnable2->MyThreadName);
FRunnableThread* RunnableThread3 = FRunnableThread::Create(Runnable3, *Runnable3->MyThreadName);

测试结果:这里我设置的线程运行次数为:1000000

最新文章

  1. ecshop修改产品详情 折扣倒计时时间
  2. Treap(树堆):随机平衡二叉树实现
  3. AndEngine
  4. [转]Asp.net三种事务处理
  5. CentOS服务器的基本配置和查看
  6. 申请Android Map 的API Key(v2)的最新申请方式(SHA1密钥)
  7. 第4条:多用类型常量,少用#define预处理指令
  8. STL 二分查找三兄弟(lower_bound(),upper_bound(),binary_search())
  9. button按钮点击不刷新(前端交流学习:452892873)
  10. 1.Why Apache Spark?
  11. jsp+struts2登录框架模板
  12. OpenStack_I版 4.Dashboard部署
  13. 快速构建一个使用axios的vue应用程序(转)
  14. aglio报错解决
  15. SpringCloud使用jpa之Rest方式
  16. DB2数据类型(抄袭)
  17. QlikView图表显示同比数据
  18. 防止putty的鼠标右键错误粘贴
  19. IOS-Storyboard全解析-第二部分
  20. Linux-&gt;ZooKeeper开机启动的俩种方式

热门文章

  1. 强化学习-学习笔记5 | AlphaGo
  2. 搭建企业级实时数据融合平台难吗?Tapdata + ES + MongoDB 就能搞定
  3. 【cartographer_ros】六: 发布和订阅路标landmark信息
  4. HashMap设计原理与实现(下篇)200行带你写自己的HashMap!!!
  5. gpg加解密异常
  6. CF1656D K-good
  7. Arraylist集合的概述和基本使用与常用方法
  8. YII 技巧
  9. C#委托的最简单入门和理解
  10. Python基础之dict和set的使用