UE4 多线程FRunnable(一)

导语
在开发过程中,有时候会遇到需要使用线程相关逻辑,比如网络相关,动态加载资源的,希望不要影响主线程的运行。
版本:UE4.25

UE4遵循C++11的标准,但是他并没有使用std::thread,而是自己实现了一套多线程机制。

在UE4里面创建多线程的三种方式,我们会分三篇来分析和使用:

  1. 继承FRunnable接口创建一个线程任务,适用于复杂运算
  2. 直接创建AsyncTask来调用线程池里面空闲的线程
  3. 通过TaskGraph系统来异步完成一些自定义任务

这三种方式本质相同,但是用法不同。

本篇尝试使用FRunnable。

案例说明

给定一个txt文件路径数组,通过异步的方式读取文件,并且返回文件的内容数组。

FRunnable分析

FRunnable 是线程的执行体,提供相应的接口。FRunnable需要依附与一个FRunnableThread对象,才能被执行,

真正的线程其实是FRunnableThread,不同平台的线程都继承自他,如FRunnableThreadWin,里面会调用Windows平台的创建线程的API接口。

1
2
3
4
5
6
// Windows平台的实现类:
class FRunnableThreadWin : public FRunnableThread
{
// Window平台的线程句柄
HANDLE Thread;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// Runtime\Core\Public\HAL\Runnable.h
class CORE_API FRunnable
{
public:

// 初始化,在聚合此方法的线程对象的上下文(FRunnableThread)中调用,而不是在将此runnable传递给新线程的线程中调用
// 在FRunnableThread创建线程对象后调用
virtual bool Init()
{
return true;
}

// 初始化成功后才会调用,这是执行线程任务的地方
virtual uint32 Run() = 0;

// 线程请求提前结束
virtual void Stop() { }

// 退出,执行清理的时候在聚合线程的上下文(FRunnableThread)中调用。
virtual void Exit() { }

// 在禁用多线程情况下运行这个可执行对象的时候,该函数可以获取单线程接口指针
// 如果这个接口没有实现
// 而且当FPlatformProcess::SupportsMultithreading() is false 时这个可执行对象不会被执行
virtual class FSingleThreadRunnable* GetSingleThreadInterface( )
{
return nullptr;
}

// 虚析构函数
virtual ~FRunnable() { }
};

实现步骤

创建TxtReadTask.h 重新生成项目代码。

1
// TxtReadTask.h

未完待续。。。

------------- 感谢您的阅读-------------
作者dreamingpoet
有问题请发邮箱 Dreamingoet@126.com
您的鼓励将成为创作者的动力