首页 > 编程语言 >UEC++ 多线程(二) AsyncTask

UEC++ 多线程(二) AsyncTask

时间:2022-10-22 16:23:59浏览次数:51  
标签:FTestAsyncTask class A1 AsyncTask 线程 UE RunCount 多线程 FAutoDeleteAsyncTask

AsyncTask

AsyncTask系统实现的多线程与自己实现继承的FRunnable实现的原理相似,还可以利用UE4提供的线程池。当使用多线程不满意时也可以调用StartSynchronousTask改成主线程执行。

来自头文件 AysncWork.h 文件中注释,直接仿照注释来实现AsyncTask

/**
    FAutoDeleteAsyncTask - template task for jobs that delete themselves when complete

    Sample code:

    class ExampleAutoDeleteAsyncTask : public FNonAbandonableTask
    {
        friend class FAutoDeleteAsyncTask<ExampleAutoDeleteAsyncTask>;

        int32 ExampleData;

        ExampleAutoDeleteAsyncTask(int32 InExampleData)
         : ExampleData(InExampleData)
        {
        }

        void DoWork()
        {
            ... do the work here
        }

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

    
    void Example()
    {
        // start an example job
        (new FAutoDeleteAsyncTask<ExampleAutoDeleteAsyncTask>(5)->StartBackgroundTask();

        // do an example job now, on this thread
        (new FAutoDeleteAsyncTask<ExampleAutoDeleteAsyncTask>(5)->StartSynchronousTask();
    }

**/

代码实现:

继承FNonAbandonableTask创建一个线程类

在DoWork中实现需要实现的功能

// FTestAsyncTask.h 

  #include "Async\AsyncWork.h"
  #include "CoreMinimal.h"

class MX_API FTestAsyncTask : public FNonAbandonableTask
{
public:
    friend class FAutoDeleteAsyncTask<FTestAsyncTask>;
    int32 RunCount = 0;

    FTestAsyncTask(FString ThreadName,class AActor1* a1) : MyThreadName(ThreadName), A1(a1) {};
    ~FTestAsyncTask();

    void DoWork();

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

    FString MyThreadName;
    class AActor1* A1;
    static FCriticalSection CriticalSection;
};
///////////////////////////////////////////////////////////////////////
// FTestAsyncTask.cpp 
FCriticalSection FTestAsyncTask::CriticalSection;

FTestAsyncTask::~FTestAsyncTask()
{

}

void FTestAsyncTask::DoWork()
{
    UE_LOG(LogTemp, Log, TEXT("%s------%d"), *MyThreadName, RunCount);
    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;
        }
    }
    
}

执行线程类:

// 头文件
    int32 TestCount;

    UPROPERTY(EditAnywhere)
        int32 TestTarget;
// 线程运行
    (new FAutoDeleteAsyncTask<FTestAsyncTask>("thread1", this))->StartBackgroundTask();
    (new FAutoDeleteAsyncTask<FTestAsyncTask>("thread2", this))->StartBackgroundTask();

在自定义执行的线程类中 使用 FAutoDeleteAsyncTask 来传入我们刚才写的Task。FAutoDeleteAsyncTask顾名思义就是任务执行完就会自动删除

还有StartBackgroundTask和StartSynchronousTask的区别:

  • StartBackgroundTask会利用线程池里空闲的线程来执行。
  • StartSynchronousTask则是主线程执行。

执行结果:

 这里运行次数设置的为100000 缺少一次是因为当满足条件是直接跳出了,没有打印出

 

标签:FTestAsyncTask,class,A1,AsyncTask,线程,UE,RunCount,多线程,FAutoDeleteAsyncTask
From: https://www.cnblogs.com/limu-zy/p/16816335.html

相关文章

  • jQuery事件
    一、jQuery事件注册1、单个事件注册(1)语法:element.事件(function(){})$("div").click(function(){事件处理程序})(2)其他事件和原生基本一致:比如mouseover、mouseout、b......
  • Vue3+TS项目无法识别自动导入提示
    遇到问题在写Vue3+TS项目的时候,经常遇到写完一个新方法后,在组件使用的时候无法自动识别。解决方案Volar:RestartVueServer重新启动Vue服务......
  • 8_vue是如何代理数据的
    在了解了关于js当中的Object.defineProperty()这个方法后,我们继续对vue当中的数据代理做一个基于现在的解析建议观看之前先了解下js当中的Obejct.defineProperty()链接地......
  • 漂浮广告floatingAd Vue版
    朋友找我帮忙写一个vue版的漂浮广告组件原版插件博客地址:http://www.ijquery.cn/?p=1291代码参考的是(jquery版),https://gitee.com/hongweizhiyuan/floatingAd,插件效果演......
  • vue里面echarts的使用
    一、先安装echarts--Handbook-ApacheECharts;二、在min的文件中引入Vue.prototype.$echarts=echarts;import*asechartsfrom'echarts';三、在html里面增加一个d......
  • 单核多线程可见性问题
    背景学习群上有个同学提出问题,如下截图这里可以看到分歧点,我认为JMM协议规定了工作内存,那么即使是单核,JAVA虚拟机也会保证线程本地内存变量的私有性,所以会存在不可见。......
  • vue-router
    入门1.前言router路由应为vue是单页应用不会有那么多html让我们跳转所有要使用路由做页面的跳转Vue路由允许我们通过不同的URL访问不同的内容。通过Vue可以实......
  • vue中工作总结
    1.vue中数据向下传递时,无法使用@close方法清除原因:传递的时候需要进行一波深拷贝方法:JSON.parse(JSON.stringify(obj))2.表格选择的时候无法再次点击取消使用elementui的时......
  • Vue 笔记6 模板分离
                   ......
  • Vue3 系统入门与项目实战2022克鲁斯卡尔算法
    ​Vue3系统入门与项目实战2022克鲁斯卡尔算法计算机的记忆金字塔1.局部性原则局部性原则是制定存储系统数据管理策略的理论基础。我们可以从两个维度来理解它:1.时间局......