首页 > 编程语言 >UEC++ 多线程(一) FRunnable

UEC++ 多线程(一) FRunnable

时间:2022-09-24 08:55:40浏览次数:55  
标签:MyThreadName FRunnableThread FRunnable TEXT A1 线程 UE 多线程 FTestRunnable

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

 

标签:MyThreadName,FRunnableThread,FRunnable,TEXT,A1,线程,UE,多线程,FTestRunnable
From: https://www.cnblogs.com/limu-zy/p/16724140.html

相关文章

  • VUE v-bind 数据绑定
    动态的绑定一个或多个attribute,也可以是组件的prop。缩写: : 或者 . (当使用 .prop 修饰符)期望: any(带参数)|Object(不带参数)参数: attrOrProp(可选的)......
  • Maximum and Minimum values for ints Python
    https://docs.python.org/3/library/sys.html#sys.int_infosys.int_infoAnamedtuplethatholdsinformationaboutPython’sinternalrepresentationofintegers......
  • Vue2项目解决-js/css文件无法引用问题
    打包:    在vue.config.js文件中  const{defineConfig}=require('@vue/cli-service')module.exports=defineConfig({  transpileDependencies:t......
  • 解决golang json: unsupported value: NaN
    遇到这种json:unsupportedvalue:NaN大部分是因为我们处理数值型的数据时,出错,导致变成了NaNnoanumber然后序列化json的时候,如果值是NaN,就会出现这个错误 仔细......
  • jquery+echarts(数据可视化图表)
      https://echarts.apache.org/zh/index.html  echarts官网  ApacheECharts支持多种下载方式,可以在下一篇教程安装中查看所有方式。这里,我们以从 jsDelivr......
  • .NET 文件系统(七)--vue3.0文件系统搭建与配置(router配置)
    不过多介绍node安装与vue-cli安装配置,自行百度1.新建vite项目npminitvite@latest选择vue,选择ts即可生成依赖:npminstall启动项目:npmrundev2.路由(router)配置......
  • js与jquery实例-拖动改变列宽和行高
     js与jquery实例-拖动改变列宽和行高如何通过javascript或者jquery实现改变表格宽度或者行高的功能?今天就把这个功能代码分享给大家,绝对原创哦,代码少而且易懂。先看效果......
  • C++ Deque
    deque是double-endedqueue的缩写,又称双端队列容器。deque容器也擅长在序列尾部添加或删除元素(时间复杂度为O(1)),而不擅长在序列中间添加或删除元素。deque容器也可......
  • Vuex 学习笔记
    组件之间共享数据的方式小范围父向子:v-bind属性绑定简写:子向父:v-on事件绑定简写@兄弟组件之间共享数据:EventBusVuex是实现组件全局状态(数据)管理的一种机制,可......
  • Vue3与Vue2的区别(面试题)
    模板指令1、v-if、v-for优先级区别3.0依然不建议写在一个元素上但是依然可以同时绑定Vue2:当在同一个元素上使用v-if时,将优先v-forVue3:v-if优先,再v-for 2、v-model......