吐槽:如果有Qt的开发经验,会发现其实在比较底层编程理念UE4和Qt极其相识.很多类名和用法甚至都是相同的.
Q.创建线程类:
UE4文档没有特别介绍关于线程模块的文章,这里自己简单记录一下,备查.
目前来说UE4的线程模块还是比较简陋的,命名风格像C#和Qt的结合体-_,-
UE4的线程的有两种比较常用的方式:
1.异步编程便捷帮助函数
2.自定义线程类
有复杂线程逻辑、涉及线程通讯的,的用自定义类.简单的用便捷帮助函数即可
说明:
1.异步编程便捷帮助函数:
跟C#的异步编程Task类基本一致.
主要涉及的相关函数和类:
Async | wait |
AsyncThread | wait |
AsyncTask | wait |
AsyncPool | wait |
例子:
wait
2.自定义线程类:
自定义线程类:一般UE4线程主要涉及FRunnableThread类和FRunnable类
FRunnableThread用于管理线程实例(如创建、暂停,销毁等)
FRunnable则是用于实现线程逻辑的具体实现(继承方式)
有三个虚函数和一个纯虚函数
Init() 初始化调用
Stop() //暂停时调用
Exit() 结束时调用
Run() //运行时调用
会按照线程状态依次执行.
用到线程的话,难免会涉及到互斥锁:
UE4的互斥锁是:FCriticalSection类。
FCriticalSection还有与之相关个FScopeLock类
FScopeLock主要是防止线程异常抛出异常死锁的.
最后说明一下,和Qt/C# 一样,只有Run函数体里面的代码和New的变量,属于子线程.而FRunnable类对象本身是属于创建他的线程的
这里列一个我用于IO本地图片的Thread栗子:
.h
class FThread_IO : public FRunnable { public: FThread_IO(); ~FThread_IO(); public: bool Init() override{ return true; } uint32 Run() override; void Stop() override{}
void Exit override();
TArray<FData_LoadTexture2DCommand> arr_waitLoadFile;
};
.cpp
FThread_IO::FThread_IO() { } FThread_IO::~FThread_IO() { this->Stop(); } uint32 FThread_IO::Run() { /** 进行本地图片的IO读取处理 线程 */ static int i= 1; static int iWidth, iHeight; static UIOHelper *helper = NewObject<UIOHelper>(); while (true) { FCriticalSection Thread_lock; if (arr_waitLoadFile.Num() > 0) { i++; Thread_lock.Lock(); bool bvaild = false; auto command = arr_waitLoadFile[0]; arr_waitLoadFile.RemoveAt(0); auto tue = helper->LoadTexture2D_FromFile(command.target_UIItem->ImageLocalFilePath, EJoyImageFormats::JPG, bvaild, iWidth, iHeight); command.target_UIItem->SetImage_texture(tue); GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, FString::Printf(TEXT(" load finished : %d"), arr_waitLoadFile.Num())); Thread_lock.Unlock(); } else { FPlatformProcess::Sleep(0.03f); } } return 0; } void FThread_IO::Exit() { GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT(" thread finished")); }
创建线程实例:
FString newThreadName("MyThread");
FThread_IO *thread_ResReader = nullptr;
auto mgr = FRunnableThread::Create(thread_ResReader, newThreadName.GetCharArray().GetData(), 0, TPri_BelowNormal);
Q.创建进程,打开额外程序方法:
FPlatformProcess::CreateProc(TEXT("程序路径");
Q.UE4进程通讯(Pipe):
以Window net form 为例:
wait