UE多线程
FRunnable
适用于复杂运算
class FSimpleRunnable: public FRunnable
{
public:
FSimpleRunnable(const FString& _ThreadName);
~FSimpleRunnable();
private:
FString ThreadName;
FRunnableThread* ThreadIns;
virtual bool Init() override;
virtual uint32 Run() override;
virtual void Stop() override;
virtual void Exit() override;
};
关于线程优先级,从高到低
enum EThreadPriority
{
TPri_TimeCritical,
TPri_Highest,
TPri_AboveNormal,
TPri_Normal,
TPri_SlightlyBelowNormal,
TPri_BelowNormal,
TPri_Lowest,
}
在构造函数中直接创建线程
// .cpp
FSimpleRunnable::FSimpleRunnable(const FString& ThreadName)
{
ThreadName = _ThreadName;
ThreadIns = FRunnableThread::Create(this, *ThreadName, 0, TPri_Normal);
}
FSimpleRunnable::~FSimpleRunnable()
{
//线程取消时的操作
}
bool FSimpleRunnable::Init()
{
return true; //若返回 false ,线程创建失败,不会执行后续函数
}
uint32 FSimpleRunnable::Run()
{
//线程执行
return 0;
}
void FSimpleRunnable::Stop()
{
//线程暂停
}
void FSimpleRunnable::Exit()
{
//线程退出
UE_LOG(LogTemp, Warning, TEXT("Thread Exit!"));
}
AsyncTask
ENamedThreads::GameThread 游戏主线程
ENamedThreads::ActualRenderingThread 实际渲染线程,有时在主线程,有时在实际渲染线程
ENamedThreads::AnyThread 任意线程
AsyncTask(ENamedThreads::GameThread, [=]()
{
//线程运行,可以便捷的使用多线程,我使用它在子线程中调用主线程
});
线程锁 FScopeLock
声明一个线程锁
FCriticalSection CS;
使用FScopeLock管理线程锁,自动处理锁定与解锁
<code>
{
// 同步对以下数据的线程访问
FScopeLock ScopeLock(&CS);
// 访问多个线程之间共享的数据
...
// 当ScopeLock超出范围时,其他线程可以访问数据
}
</code>
直接用FCriticalSection处理
CS->Lock();//锁定
CS->UnLock();//解锁
CS->TryLock();//尝试锁定,如果成功锁定,返回true,如果已被锁定,返回false
TaskGraph
太麻烦了,以后再说
原创文章,转载请注明来自 Unbound Fanatic
评论
匿名评论
隐私政策
你无需删除空行,直接评论以获取最佳展示效果