UE4_AsyncTask应用笔记

2023-11-11

在开发过程中如果把所有的逻辑都放到GameThread里,难免会卡顿。因此这时候,往往会用到多线程。UE4提供的多线程解决方案有三种。这里我们着重说一下AsyncTask的应用。

一般来说,用AsyncTask都是一些业务逻辑不复杂的交给它来处理。因为省去了new Thread的开销。
AsyncTask 下边又有几种不同的Task类型,这里说的是FNonAbandonableTask 和 FAutoDeleteAsyncTask。

对于FAutoDeleteAsyncTask,在任务结束的时候,它会自动清理。我们并不需要手动清理,但是造成的问题就是,如果我们在new FAutoDeleAsyncTask 传入了外部的类实例,在外部类实例销毁时,new 出来的Task 可能并没有运行结束,这里就会报空指针的问题,造成程序的中断和崩溃。

因此,当我们需要外部传入类实例的时候,可以使用FAutoDeleteAsyncTask,因为它下边提供了可以用来判断任务是否已经结束了的API接口。
如下:

/** Returns true if the work and TASK has completed, false while it's still in progress. 
	 * prior to returning true, it synchronizes so the task can be destroyed or reused
	 */
	bool IsDone()
	{
		if (!IsWorkDone())
		{
			return false;
		}
		SyncCompletion();
		return true;
	}

	/** Returns true if the work has completed, false while it's still in progress. 
	 * This does not block and if true, you can use the results.
	 * But you can't destroy or reuse the task without IsDone() being true or EnsureCompletion()
	*/
	bool IsWorkDone() const
	{
		if (WorkNotFinishedCounter.GetValue())
		{
			return false;
		}
		return true;
	}

	/** Returns true if the work has not been started or has been completed. 
	 * NOT to be used for synchronization, but great for check()'s 
	 */
	bool IsIdle() const
	{
		return WorkNotFinishedCounter.GetValue() == 0 && QueuedPool == 0;
	}
	/** 
	* Wait until the job is complete
	* @param bDoWorkOnThisThreadIfNotStarted if true and the work has not been started, retract the async task and do it now on this thread
	**/
	void EnsureCompletion(bool bDoWorkOnThisThreadIfNotStarted = true)
	{
		bool DoSyncCompletion = true;
		if (bDoWorkOnThisThreadIfNotStarted)
		{
			if (QueuedPool)
			{
				if (QueuedPool->RetractQueuedWork(this))
				{
					// we got the job back, so do the work now and no need to synchronize
					DoSyncCompletion = false;
					DoWork(); 
					FinishThreadedWork();
					QueuedPool = 0;
				}
			}
			else if (WorkNotFinishedCounter.GetValue())  // in the synchronous case, if we haven't done it yet, do it now
			{
				DoWork(); 
			}
		}
		if (DoSyncCompletion)
		{
			SyncCompletion();
		}
		CheckIdle(); // Must have had bDoWorkOnThisThreadIfNotStarted == false and needed it to be true for a synchronous job
	}

因此,可以在析构一个类时,等待所有的Task完成,再执行析构和退出,就不会再报异常错误。

// 数组
TArray<FAsyncTask<DoKafkaTask>*> TaskArr;

FAsyncTask<DoKafkaTask>* task = new FAsyncTask<DoKafkaTask>(this, request);
TaskArr.Add(task);
task->StartBackgroundTask();

AKafkaMsgManager::~AKafkaMsgManager()
{
	// 确保所有的异步任务被执行完毕 不然会在异步任务中报空指针的错误
	for (auto local_task : TaskArr)
	{
		if (!local_task->IsDone())
		{
			local_task->EnsureCompletion();
		}
	}
}


其他另外关于多线程和异步的文章,请参阅。
UE4_异步_数据处理(Json)
UE4_多线程、异步执行任务

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

UE4_AsyncTask应用笔记 的相关文章

  • Niagara官方示例笔记 - 盘点自带重要模块

    Emitter State life cycle生命周期控制 发射器选择system 所有发射器都在system的state里设置生命周期 选择self 发射器独立控制 可以给发射器创建不同类型变量 使用set parameter模块计算
  • UE4的SpawnActor问题

    1 SpawnActor传参 做项目过程中发现先SpawnActor再传参会先运行 生成的Actor的BeginPlay然后才进行传参 可是我在BeginPlay时就需要用到参数做操作了 发生情况时代码如下 if BaseCharactor
  • 解决UE4启动出现UE4Editor.exe-无法找到dll入口的弹窗

    UE4编辑器启动 一开始遇到的问题如下 上网找问题得到的解答都是在cmd下利用regsvr32 exe注册该dll到注册表 但是也提示报错 上网搜了一下 得知原因是生成该dll的源码没有实现 DllRegisterServer和DllUne
  • UE4、5不让贴花影响Mesh

    如果不想让贴花影响某些在移动中的物体穿过它也会受到影响 例如人 车之类的 可以把mesh里的Receives Decals选项去掉
  • 想用好虚幻4引擎做游戏,你需要避免这些扰人的坑(备忘)

    在手游品质越发上扬的如今 已经有不少厂商开始使用一些性能更好的引擎 去尝试游戏制作了 而虚幻4引擎 以下简称UE4 就是其中之一 在这款引擎中已经诞生了诸如 铁拳7 地狱之刃 帕拉贡 等一系列大作 对玩家而言 这些作品都是不折不扣的视觉盛宴
  • UE4 UE4 C++ Gameplay Abilities的GameplayCue

    UE4 UE4 C Gameplay Abilities的GameplayCue GAS参考文档 用GameplayCue 做一个玩家加血 buff效果 初始化 加血 加buff buff消失 加血的播放一个粒子特效 这个是用Gamepla
  • UE TSubclassOf

    定义 TSubclassOf
  • 专题详解-5G接入控制(1)

    相关文章会在公众号同步更新 公众号 5G通信大家学 持续更新的相关5G内容都是直接根据3GPP整理 保证更新内容的准确性 避免通过二手 甚至多手的资料 以讹传讹误导网友 最近工作中遇到了一些5G专网接入限制的问题 以前没仔细研究 借着解决这
  • 2022年11月计划(cesium for ue源码抄写+ socket视频学习+ue4 tf视频学习)

    根据规划 进行cesium for ue源码抄写 网络视频教程 ue4 tf1视频学习
  • UE4-蓝图函数库

    UE4 蓝图函数库 概述 蓝图函数库 Blueprint Function Library 是一个静态函数的合集 提供不与特定游戏性对象绑定的效用功能 即不用绑定到对象身上 再到蓝图中进行调用 可以非常方便的将代码中的函数暴露给所有蓝图使用
  • ue中的经纬高转xyz的问题

    在ue中 做了个地球仪 发现经纬度转地心坐标系老是出问题 后来发现 是转ue时 x y坐标要互换 也对 因为在cesium for unreal中还有一系列ecef转ue的相关函数 即下面的代码中 xy需要互换 在ue中才能正常使用 偏心率
  • 使用UE4(UnrealEngine)创建工程

    UE4系列文章目录 文章目录 UE4系列文章目录 前言 一 步骤 1 打开UE4软件 2 新建工程 3 选择游戏类型模板 4 项目设置 运行游戏 前言 使用UE4 UnrealEngine 创建工程 我这里的ue4版本是4 27 2 一 步
  • UE4 UI界面

    在UE4中创建UI界面是创建一个widget 进去之后左上角是选择控件 找到直接拖上去 中间那个框代表的就是我们的屏幕 在button中打字也就是给button命名时需要在上面在拖一个text控件 更好的排版可以改变锚点 这四个就类似与边距
  • UE4持续集成打包(Mac脚本自动化打包)

    主要通过RunUAT进行打包 win和mac均可以打包 本次打包实现在Mac环境下 使用 Engine Build BatchFiles RunUAT sh 参考命令格式 参考文献1 RunUAT BuildCookRun project
  • UE4 关于使用Webbrowser插件遇到的问题以及解决办法

    1 无法播放网页视频 这是因为UE4的WebBrowser自带的cef3为3071版本 默认不支持h364等直播流 导致web里的直播流无法播放 解决办法 第一种办法 重新编译了cef源码 改成支持H 264 然后在UE4安装目录下替换相关
  • UE4 VR WidgetInteraction 局域网设定

    无论用什么 我们要先确定是什么 鲁迅 下面是关于WidgetInteraction的官方定义 控件交互组件执行光线投射 确定它是否命中世界场景中的控件组件 如命中 可设置规则确定与其交互的方式 交互通过模拟定义的按键来执行 例如一个按钮可通
  • 2021年11月6日-11月12日(ogre抄写+ue4视频,本周35小时,共1035小时,剩8965小时。)

    这周还不错 不但完成了本周学习任务 还完成了本月学习任务 方法就是 拼命抄源码 抄到吐时就再看看Ue4视频教程 内外兼修 可以在未来的日子里这么进行 每天5小时学习 还是进入状态的 5 7 35小时 共1035小时 剩8965小时 另外 去
  • ue4 蓝图通信的几种方式

    一 设置公有变量 完成通信 1 蓝图类Door bp中声明变量NewVar 1 为公有 确定好变量类型 编译 2 关卡视口中选中这个蓝图类Door bp的实例 世界大纲视图下的细节面板中 默认下出现公有变量名称NewVar 1 用吸管吸取关
  • ue4_timeline时间轴

    1 给一个cube添加蓝图 需要修改的是z轴方向移动位置 将z轴传入时间轴 时间轴蓝图如下 z轴时间轴修改为 第一个节点 time 0 value 300 物体的z轴初始位置 第二个节点 time 1 value 600 z轴移动300个单
  • UE4(Unreal Engine4)在蒙太奇动画中添加音频轨道通知

    UE4系列文章目录 文章目录 UE4系列文章目录 前言 一 遇到的问题 二 操作步骤 前言 UE4 Unreal Engine4 在蒙太奇动画中添加音频轨道通知 我们想在某一帧动画中添加声音 比如我们想在动画的第13帧这里添加音效 一 遇到

随机推荐

  • 1-5、Lua函数

    1 5 Lua函数 文章目录 1 5 Lua函数 5 1 多返回值 5 2 可变参数 5 3 命名参数 函数有两种用途 1 完成指定的任务 这种情况下函数作为调用语句使用 2 计算并返回值 这种情况下函数作为赋值语句的表达式使用 语法 fu
  • ffmpeg批量转换ape为mp3

    1 新建一个txt文件 并复制如下代码进入 然后保存 echo off title cd d dp0 for a in ape do ffmpeg i sa y acodec libmp3lame aq 0 na mp3 pause 2 把
  • 批量重命名:删除文件名相同的部分或指定的部分

    本代码提供两个函数 1 用于批量重命名文件 重命名时 删除 路径 下的文件名中含有 重复名 的部分 重命名删除同义名 路径 重复名 例如 删除 Image001 png Image002 png Image003 png 中的 Image
  • [Python人工智能] 六.神经网络的评价指标、特征标准化和特征选择

    从本系列文章开始 作者正式开始研究Python深度学习 神经网络及人工智能相关知识 前五篇文章讲解了神经网络基础概念 Theano库的安装过程及基础用法 theano实现回归神经网络 theano实现分类神经网络 theano正规化处理 这
  • DS1302时钟模块

    DS1302结构原理图 DS1302涓流充电计时芯片实时时钟 日历和31字节的静态RAM 通过IO口与微机处理器通讯 该实时时钟 日历提供年月日和时分秒星期 还具备月份闰平年自动校正 其信息与外部的传输由CE I O和SCLk 串行时钟 决
  • 数据库聚合函数

    1 常用函数 常用函数这里就不过多的阐述和演示 大家感兴趣的话 可以去官网看 官网地址 MySQL Developer Zone 我们主要讲聚合函数 2 聚合函数 聚合函数是我们经常使用的函数 常用聚合函数名称 描述 1 count 计数
  • MySQL从安装到精通(多表)

    目录 1 创建练习环境 1 1创建一个部门表 1 2创建一个员工表 2 多表查询的分类 2 1mysql 表子查询 2 1 1什么是子查询 subquery sql 2 1 2 单行子查询 2 1 3多行子查询 2 1 2 多列子查询 2
  • 【python】如何把你的python包发布出去(pip install)

    python 如何把你的python包发布出去 pip install 介绍 实际上分为两步 打包 发布 我们要发布的网站是https pypi org 也就是用户通过pip install XXX 就可以安装你的包 1 通过setupto
  • python环境的安装(Windows)

    步骤一安装 打开python官网https www python org 点击Downloads 选择Windows进入后根据自己的电脑是32位还是64位 右击此电脑属性查看 选择相应的版本下载 注意 要选择Windows installe
  • 【2023硅谷数模笔试题】~ 题目及参考答案

    本章目录 0 前言 1 题目 答案 第一题 第二题 第三题 第四题 第五题 第六题 第七题 第八题 第九题 第十题 第十一题 声明 0 前言 哈喽 二舅 最近和你们一样 不断被鞭策 今天抽个小空给大家带来的是前几天做的一套笔试题 名称如标题
  • 谈谈tomcat的优化经验

    第一次写博客 搜集了很多的优化经验 然后自己归纳下来 大概有7条 没涉及到的欢迎大家补充 1 优化方法 加大tomcat使用的jvm的内存 具体操作 Tomcat默认可以使用的内存为128MB 可在配置文件或环境变量里增加使用内存 在配置文
  • IDEA创建Maven工程后卡死,问题分析及解决

    问题 同标题 IDEA创建Maven工程后卡死 网上收集经验后 大多数版本为2020及以后的问题 但应该是同样的问题 即archetype catalog xml文件太大源地址下载过慢 这里记录一下方便的解决方式 解决方法 提前将arche
  • IDEA 热部署插件 -- JRebel

    从idea找到设置Plugins插件 激活参考http www javatiku cn idea 51 html 服务器链接 http idea javatiku cn ad4bd706 15a3 4ecf b3e3 c7b6a64942b
  • GCC强大背后

    前记 经常浏览博客园的同学应该会觉得本文有标题党之嫌 这个标题的句式来自于MiloYip大牛的大作 C 强大背后 在此 向Milo兄致意 GCC 全称GNU Compiler Collection 是一套GNU开发的编译器环境 它的创始人便
  • ENVI监督分类及精度评价

    最近协助同学做了完整的监督分类数据 特此记录下来 对于ENVI监督分类 是每一个遥感从业者掌握的最基础的一个方法 但是完整的监督分类流程和精度评价 估计往往认识不够 所以以下的分享还是有点意义 监督分类 又称训练分类法 用被确认类别的样本像
  • 34岁,转行软件测试工程师后月薪8K,我仍然坚持转行!

    本人今年34岁 目前已成功转行软件测试工程师 月薪8K 对于很多人而言 我这个年纪转行不仅有些晚 还要担许多未知的职场风险 我深知自己这一路并不容易 以下就和大家分享一下我的转行经历吧 到了我这个年纪的人 大多都被社会这个大染缸染得面目全非
  • Docker搭建ELK日志采集服务及Kibana可视化图表展示

    架构 ES docker network create elk mkdir p opt ELK es data chmod 777 opt ELK es docker run d name elasticsearch net elk p 9
  • Vue——插件

    目录 介绍 编写一个插件 介绍 插件 Plugins 是一种能为 Vue 添加全局功能的工具代码 下面是如何安装一个插件的示例 import createApp from vue const app createApp app use my
  • .NET混淆器 Dotfuscator v4.43.1新版发布!允许某些外部程序集输入!

    Dotfuscator是一个 NET的Obfuscator 它提供企业级的应用程序保护 大大降低了盗版 知识产权盗窃和篡改的风险 Dotfuscator的分层混淆 加密 水印 自动失效 防调试 防篡改 报警和防御技术 为世界各地成千上万的应
  • UE4_AsyncTask应用笔记

    在开发过程中如果把所有的逻辑都放到GameThread里 难免会卡顿 因此这时候 往往会用到多线程 UE4提供的多线程解决方案有三种 这里我们着重说一下AsyncTask的应用 一般来说 用AsyncTask都是一些业务逻辑不复杂的交给它来