UE4笔记-进程/线程/网络/IO模块的相关问题记录
吐槽:如果有Qt的開發(fā)經(jīng)驗(yàn),會發(fā)現(xiàn)其實(shí)在比較底層編程理念UE4和Qt極其相識.很多類名和用法甚至都是相同的.
Q.創(chuàng)建線程類:
UE4文檔沒有特別介紹關(guān)于線程模塊的文章,這里自己簡單記錄一下,備查.
?
目前來說UE4的線程模塊還是比較簡陋的,命名風(fēng)格像C#和Qt的結(jié)合體-_,-
?
UE4的線程的有兩種比較常用的方式:
1.異步編程便捷幫助函數(shù)
2.自定義線程類
有復(fù)雜線程邏輯、涉及線程通訊的,的用自定義類.簡單的用便捷幫助函數(shù)即可
?
說明:
1.異步編程便捷幫助函數(shù):
跟C#的異步編程Task類基本一致.
主要涉及的相關(guān)函數(shù)和類:
?
| Async | wait |
| AsyncThread | wait |
| AsyncTask | wait |
| AsyncPool | wait |
?
?
?
?
?
例子:
wait
2.自定義線程類:
自定義線程類:一般UE4線程主要涉及FRunnableThread類和FRunnable類
FRunnableThread用于管理線程實(shí)例(如創(chuàng)建、暫停,銷毀等)
FRunnable則是用于實(shí)現(xiàn)線程邏輯的具體實(shí)現(xiàn)(繼承方式)
有三個虛函數(shù)和一個純虛函數(shù)
? Init() 初始化調(diào)用
? Stop() //暫停時調(diào)用
Exit() 結(jié)束時調(diào)用Run() //運(yùn)行時調(diào)用 會按照線程狀態(tài)依次執(zhí)行.
用到線程的話,難免會涉及到互斥鎖:
UE4的互斥鎖是:FCriticalSection類。
FCriticalSection還有與之相關(guān)個FScopeLock類
FScopeLock主要是防止線程異常拋出異常死鎖的.
?最后說明一下,和Qt/C# 一樣,只有Run函數(shù)體里面的代碼和New的變量,屬于子線程.而FRunnable類對象本身是屬于創(chuàng)建他的線程的
這里列一個我用于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() {/** 進(jìn)行本地圖片的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")); }創(chuàng)建線程實(shí)例:
FString newThreadName("MyThread"); FThread_IO *thread_ResReader = nullptr; auto mgr = FRunnableThread::Create(thread_ResReader, newThreadName.GetCharArray().GetData(), 0, TPri_BelowNormal);?
Q.創(chuàng)建進(jìn)程,打開額外程序方法:
FPlatformProcess::CreateProc(TEXT("程序路徑");
Q.UE4進(jìn)程通訊(Pipe):
以Window net form 為例:
wait
轉(zhuǎn)載于:https://www.cnblogs.com/linqing/p/5767359.html
總結(jié)
以上是生活随笔為你收集整理的UE4笔记-进程/线程/网络/IO模块的相关问题记录的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python实现中文图片文字识别--OC
- 下一篇: django权限管理