UEC++ 多线程(一) FRunnable

虚幻官方文档: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

UEC++ 多线程(一) FRunnable

 

发表评论

评论已关闭。

相关文章