吐槽:如果有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