Runnable线程
创建接口类TaskInterface
#include "CoreMinimal.h"
#include "UObject/Interface.h"
#include "TaskInterface.generated.h"
UINTERFACE(MinimalAPI)
class UTaskInterface : public UInterface
{
GENERATED_BODY()
};
class GAMEWORLDBASE_API ITaskInterface
{
GENERATED_BODY()
public:
void DoWork();
};
#include "TaskInterface.h"
void ITaskInterface::DoWork()
{
UE_LOG(LogTemp, Log, TEXT("Work!"));
}
创建线程类ThreadTask继承自FRunnable
#include "CoreMinimal.h"
#include "HAL/Runnable.h"
#include "HAL/RunnableThread.h"
#include "TaskInterface.h"
class GAMEWORLDBASE_API ThreadTask : public FRunnable
{
public:
ThreadTask();
~ThreadTask();
virtual uint32 Run();
void CreateThread(ITaskInterface* NewInterface);
private:
ITaskInterface* TaskInterface;
FRunnableThread* TaskThread;
};
#include "ThreadTask.h"
ThreadTask::ThreadTask()
{
TaskInterface = nullptr;
}
uint32 ThreadTask::Run()
{
UE_LOG(LogTemp, Log, TEXT("ThreadRun"));
if (TaskInterface)
{
TaskInterface->DoWork();
}
return 0;
}
void ThreadTask::CreateThread(ITaskInterface* NewInterface)
{
TaskInterface = NewInterface;
TaskThread = FRunnableThread::Create(this,TEXT("MyThread"),0,TPri_Normal);
}
在线程类ThreadTask的Run方法打个断点

运行游戏,在断点处停止,可以看到已经进入新创建的线程

打开调用堆栈

FRunnableThreadWin函数的Run方法

大概流程:
- 初始化
- 激活同步事件
- 设置Tls(Tls用于后面清理线程)
- 执行Run方法,也就是我们的子类里面的Run方法
- 退出。
打开OutputLog,函数成功执行


浙公网安备 33010602011771号