对FRunable
的创建和使用进行规范化操作
class **_API MyRunable: public FRunnable
{
public:
MyRunable(args): Stopping(false), Thread(nullptr), ThreadName(name_){}
virtual ~MyRunable() override;
public:
void Start();
virtual bool Init() override;
virtual uint32 Run() override;
virtual void Stop() override;
virtual void Exit() override;
public:
TQueue<FDroneBaseInfo, EQueueMode::Mpsc> queue;
private:
bool Stopping;
FRunnableThread* Thread;
FString ThreadName;
};
- 继承
FRunable
- 重写方法
virtual ~MyRunable() override;
MyRunable::~MyRunable()
{
if (Thread != nullptr)
{
Thread->Kill(true);
delete Thread;
}
}
void MyRunable::Start()
{
Thread = FRunnableThread::Create(this, *ThreadName, 128 * 1024, TPri_AboveNormal, FPlatformAffinity::GetPoolThreadMask());
}
virtual bool Init() override;
bool MyRunable::Init()
{
return true;
}
virtual uint32 Run() override;
uint32 MyRunable::Run()
{
while (!Stopping)
{
}
return 0;
}
virtual void Stop() override;
void MyRunable::Stop()
{
Stopping = true;
}
virtual void Exit() override;
virtual void Exit() override { }
- 使用自定义的线程类
MyRunable
- 线程的使用
在上述的定义中大概说明了线程的生命周期,由创建线程(ThreadID = A)
创建MyRunable
对象RunableInA
,在构造函数中初始化信息;然后调用RunableInA->Start()
,创建真正的线程;线程创建完成后,自动执行Init()
、Run()
;由于在线程A
中存在MyRunable
的引用RunableInA
,因此,可以在线程A
中调用RunableInA->Stop()
暂停线程的运行;最后在A
结束后可以析构RunableInA
,结束线程以及删除RunableInA
。
- 使用方法
MyRunable* RunableInA = new MyRunable(args);
RunableInA->Start();
RunableInA->Stop();
RunableInA->Stop();
if(RunableInA)
{
delete RunableInA;
RunableInA = nullptr;
}
- 线程的生命周期
想要充分利用多线程开发的优势,需要熟悉线程的生命周期,可以使用Windows::GetCurrentThreadId()
获取当前的线程ID,假设创建MyRunable
的线程ID为:ThreadID = ParentValue
,执行MyRunable
的Start
后创建的线程ID为:ThreadID = ChildValue
,则线程的生命周期如下:

【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 【自荐】一款简洁、开源的在线白板工具 Drawnix
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
· 园子的第一款AI主题卫衣上架——"HELLO! HOW CAN I ASSIST YOU TODAY
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报