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方法

大概流程:

  1. 初始化
  2. 激活同步事件
  3. 设置Tls(Tls用于后面清理线程)
  4. 执行Run方法,也就是我们的子类里面的Run方法
  5. 退出。

打开OutputLog,函数成功执行

posted @ 2020-05-17 17:59  CodeWithMe  阅读(380)  评论(0)    收藏  举报