当前位置: 首页 > news >正文

镇江微网站建设谷歌google搜索引擎入口

镇江微网站建设,谷歌google搜索引擎入口,制作房地产网站页面,wordpress移动端底部导航栏目录 概念 函数说明 注意事项 (1)线程安全问题 (2)依赖特定线程执行的任务限制 (3)任务执行顺序和时间不确定性 使用示例 概念 AsyncTask 允许开发者将一个函数或者一段代码逻辑提交到特定的线程去执…

 目录

概念

函数说明

注意事项

(1)线程安全问题

(2)依赖特定线程执行的任务限制

(3)任务执行顺序和时间不确定性

使用示例


概念

  AsyncTask 允许开发者将一个函数或者一段代码逻辑提交到特定的线程去执行,这样做的好处是可以避免阻塞当前线程(比如主线程),充分利用多线程的优势,实现并发执行任务,提升程序的响应性和整体性能。例如,在游戏开发中,可以将一些耗时的操作(如文件加载、网络通信、复杂的数据计算等)通过 AsyncTask 放到后台线程去执行,让主线程能够继续处理用户输入、渲染画面等对实时性要求较高的任务,防止游戏出现卡顿现象。

函数说明

  AsyncTask 函数原型如下:

template<typename ThreadType, typename FunctionType>
FAsyncTask<ThreadType, FunctionType> AsyncTask(ThreadType InThreadType, FunctionType&& InFunction);

  AsyncTask 函数接收两个参数:

(1)InThreadType 参数:这个参数用于指定要将任务提交到哪个线程去执行,通常是ENamedThreads枚举类型中的一个值。ENamedThreads 定义了虚幻引擎中一些常见的、有特定用途的线程类型,比如:

    ENamedThreads::AnyThread:表示任务可以在任意可用的线程中执行,引擎会根据当前的线程资源情况自动选择一个合适的线程来运行该任务。

     ENamedThreads::GameThread:专门用于执行和游戏逻辑紧密相关的任务,像处理游戏中的角色行为、更新游戏状态等大部分核心游戏逻辑通常都在游戏线程中执行。很多时候需要将一些其他线程中的操作结果反馈到游戏线程中(例如更新 UI 元素,因为 UI 的更新通常要求在游戏线程进行),就可以使用 AsyncTask 将相关任务提交到游戏线程来完成。

(2)InFunction 参数:这个参数是一个可调用对象(比如函数指针、lambda 表达式等),它定义了要在指定线程中实际执行的任务逻辑。可以将具体需要异步执行的代码封装在这个可调用对象里,例如一个简单的 lambda 表达式示例如下:

AsyncTask(ENamedThreads::BackgroundThread, []() {// 这里放置需要在后台线程执行的任务逻辑,比如加载资源文件FString FilePath = TEXT("Path/To/SomeResourceFile.txt");FString FileContent;FFileHelper::LoadFileToString(FileContent, *FilePath);// 可以继续添加对加载后的资源文件内容进行处理等其他逻辑
});

注意事项

(1)线程安全问题

        虽然 AsyncTask 提供了方便的异步任务执行机制,但在不同线程之间传递数据或者操作共享资源时,需要特别注意线程安全问题。例如,如果一个异步任务在后台线程中修改了某个共享变量,而主线程或者其他线程也会访问这个变量,就可能导致数据不一致、程序崩溃等并发访问冲突问题。解决办法通常是使用合适的多线程同步机制(如临界区 FCriticalSection 、互斥锁 FMutex 等)来保护对共享资源的访问确保在多线程环境下数据的一致性和操作的正确性。

        使用临界区 FCriticalSection的示例代码如下,通过如下方式来保护对共享变量 SharedVariable 的访问,保证在同一时刻只有一个线程能对其进行修改或读取操作,避免了并发冲突。

#include "CoreMinimal.h"
#include "HAL/CriticalSection.h"int SharedVariable = 0;
FCriticalSection CriticalSection;void BackgroundTaskFunction()
{FScopeLock Lock(&CriticalSection);SharedVariable++;
}void SomeFunction()
{AsyncTask(ENamedThreads::BackgroundThread, BackgroundTaskFunction);// 在主线程或者其他可能访问 SharedVariable 的线程中,同样需要加锁保护访问FScopeLock Lock(&CriticalSection);UE_LOG(LogTemp, Log, TEXT("SharedVariable value: %d"), SharedVariable);
}

(2)依赖特定线程执行的任务限制

         有些任务对执行的线程有严格要求,比如UI 更新操作通常要求在游戏线程中进行,如果错误地将这类任务提交到其他非游戏线程执行,可能会导致程序出现未定义行为,比如 UI 元素无法正确显示、界面闪烁或者程序崩溃等问题。因此,在使用 AsyncTask 时,要清楚了解任务的性质以及对执行线程的要求,确保将任务提交到合适的线程中去执行。

        例如,当需要更新游戏中的 UI 文本显示时,必须通过 AsyncTask 将更新 UI 的任务逻辑提交到游戏线程,示例如下:

void UpdateUIText(const FString& NewText)
{AsyncTask(ENamedThreads::GameThread, [NewText]() {// 获取对应的 UI 控件并更新其文本内容,GetUITextWidget 函数用于获取 UI 文本控件UTextWidget* TextWidget = GetUITextWidget();if (TextWidget!= nullptr){TextWidget->SetText(FText::FromString(NewText));}});
}

(3)任务执行顺序和时间不确定性

        由于 AsyncTask 是将任务放入线程的任务队列中等待执行,并且不同线程的调度顺序以及执行时间受到多种因素影响(如系统负载、线程优先级等),所以无法准确保证提交的异步任务一定会按照调用 AsyncTask 的顺序依次执行,也不能精确预测任务具体的执行时间。

        例如,连续提交了几个异步任务到同一个线程中,可能会因为系统资源分配、其他高优先级任务插入等原因,导致后提交的任务反而先执行,或者任务执行的时间间隔比预期的长很多。

        在一些对任务执行顺序和时间有严格要求的场景下,需要额外设计一些同步机制或者逻辑来确保任务按照期望的顺序和时间执行。比如可以通过信号量、条件变量等机制来协调多个异步任务之间的执行顺序,或者添加一些等待和检查机制来确保某个关键任务完成后再执行后续任务等。

使用示例

        通过 AsyncTask 实现累加求和任务。

1. 新建一个空白c++类“ThreadSubsystem”,继承“UGameInstanceSubsystem”,然后添加三个成员函数“InitAsyncTask”、“GetMyNum”、“SetMyNum”和一个成员变量“MyNum”

2. “InitAsyncTask”实现如下。首先将类成员变量 MyNum 的值复制到局部变量 CopyNum 中,然后在一个异步任务(提交到 ENamedThreads::AnyThread ,也就是任意可用线程)中计算从 0 到 9999 的累加和并累加到 CopyNum 上,接着让线程休眠 0.5 秒,之后再通过另一个异步任务(提交到 ENamedThreads::GameThread ,游戏线程)将计算得到的总和 sum 设置回类的成员变量 MyNum 中,并输出一条包含总和值的日志信息,以此展示了在不同线程中执行任务以及跨线程更新数据的流程。

3. “GetMyNum”、“SetMyNum”实现如下。其中“SetMyNum”函数主要目的是设置 MyNum 的值。不过,在设置值之前做了一个线程判断,即检查当前是否处于游戏线程中。如果当前不是在游戏线程,通过 AsyncTask 将设置值的操作重新提交到游戏线程中去执行,以此来确保对 MyNum 成员变量的赋值操作符合线程安全的要求(通常很多与游戏逻辑相关的变量操作需要在游戏线程中进行,以避免出现未定义行为)。

4. 编译后,在关卡蓝图中设置通过按键触发函数“InitAsyncTask”

调用后可以看到输出的日志信息

“ThreadSubsystem”类 代码:

// Fill out your copyright notice in the Description page of Project Settings.#pragma once#include "CoreMinimal.h"
#include "SimpleRunnable.h"
#include "HAL/ThreadManager.h"
#include "ThreadSubsystem.generated.h"UCLASS()
class STUDY_API UThreadSubsystem : public UGameInstanceSubsystem
{GENERATED_BODY()public:virtual bool ShouldCreateSubsystem(UObject* Outer) const override;virtual void Initialize(FSubsystemCollectionBase& Collection) override;virtual void Deinitialize() override;public:UFUNCTION(BlueprintCallable)void InitAsyncTask();int32 GetMyNum();void SetMyNum(int32 InInt);void BloackThreadPool();protected:int32 MyNum = 0;};
// Fill out your copyright notice in the Description page of Project Settings.#include "Thread/ThreadSubsystem.h"bool UThreadSubsystem::ShouldCreateSubsystem(UObject* Outer) const
{return true;
}void UThreadSubsystem::Initialize(FSubsystemCollectionBase& Collection)
{Super::Initialize(Collection);
}void UThreadSubsystem::Deinitialize()
{Super::Deinitialize();
}void UThreadSubsystem::InitAsyncTask()
{int32 CopyNum = MyNum;AsyncTask(ENamedThreads::AnyThread, [this, CopyNum]() {int32 sum = CopyNum;for (size_t i = 0; i < 10000; i++){sum += i;}FPlatformProcess::Sleep(0.5);AsyncTask(ENamedThreads::GameThread, [this, sum]() {SetMyNum(sum);UE_LOG(LogTemp, Warning, TEXT("Sum: %d"), sum);});});
}int32 UThreadSubsystem::GetMyNum()
{return MyNum;
}void UThreadSubsystem::SetMyNum(int32 InInt)
{if (!IsInGameThread()){AsyncTask(ENamedThreads::GameThread, [this, InInt]() {SetMyNum(InInt);});}MyNum = InInt;
}
http://www.tj-hxxt.cn/news/95466.html

相关文章:

  • 全面的锦州网站建设网络媒体广告代理
  • 客户网站 备案网站分享
  • 哈尔滨企业网站东营网站建设制作
  • 青海企业网站制作精准引流的网络推广方法
  • 广 做网站蓝光电影下载50篇经典软文100字
  • 如何创建一个网站用来存放东西seo比较好的优化方法
  • 网站建设支付百度通用网址
  • 家在深圳坂田业主论坛东莞优化排名公司
  • 国外常用视频网站tenor怎么设置网络营销推广外包服务
  • 应持续抓好二级网站的建设工作武汉今日新闻头条
  • 免费的微网站制作torrentkitty搜索引擎
  • 作品集公司网站windows优化软件
  • 单位门户网站建设的请示如何做seo整站优化
  • 手机怎么提升网站流量nba排行榜最新排名
  • 数据库网站建设百度指数的主要用户是
  • 有什么做日结兼职的网站百度指数平台
  • 岳阳公司网站开发网络推广服务合同
  • 河北省建设机械协会网站是真的吗小广告怎么能弄干净
  • 网站商城维护怎么做竞价推广论坛
  • 西安专业网站建设服务好优化网站seo公司
  • 传销公司做网站运营seo的工作内容主要包括
  • seo实战培训费用石家庄seo代理商
  • 做一个公司官网怎么做seo咨询价格找推推蛙
  • DW怎么做招聘网站优化提升
  • 注册做网站的营业执照哪些浏览器可以看禁止访问的网站
  • 网页翻译为中文优化大师怎么样
  • 中国网站今日国内新闻摘抄十条
  • iis的默认网站没有自动启动最新百度关键词排名
  • 成都学网站建设费用大连seo
  • 网站内部链接导向网站服务费一年多少钱