UE4/5C++多线程插件制作(二、简单的对Runnable进行封装)
发布人:shili8
发布时间:2024-12-28 16:17
阅读次数:0
**UE4/5 C++ 多线程插件制作(二)**
在上一篇文章中,我们已经了解了如何使用 UE4/5 的多线程功能来创建一个简单的插件。然而,仅仅使用 `Runnable` 来进行多线程编程可能会导致代码变得混乱和难以维护。
因此,在本文中,我们将学习如何对 `Runnable` 进行封装,以便更好地管理多线程逻辑,并且使得我们的插件更加易于维护和扩展。
**1. 为什么需要对 Runnable 进行封装?**
在 UE4/5 中,`Runnable` 是一个用于执行多线程任务的类。然而,它本身并没有提供任何管理或组织功能,这意味着我们必须手动处理所有的逻辑和状态。
例如,如果我们有多个 `Runnable` 实例,并且它们之间存在依赖关系,我们就需要手动同步这些实例以避免数据竞争。这会导致代码变得复杂和难以维护。
**2. 如何对 Runnable 进行封装?**
为了解决上述问题,我们可以创建一个新的类来对 `Runnable` 进行封装。这个新类可以提供一些基本的功能,如:
* **线程管理**: 提供一种方式来管理多个 `Runnable` 实例,例如启动、停止和暂停等。
* **状态管理**: 为每个 `Runnable` 实例提供一个状态机,以便更好地跟踪它们的执行状态。
* **依赖关系管理**: 提供一种方式来管理不同 `Runnable` 实例之间的依赖关系。
下面是对 `Runnable` 进行封装的一个示例代码:
cpp// MyRunnable.h#pragma once#include "CoreMinimal.h" #include "Runtime/Core/Public/HAL/Runnable.h" class MYPLUGIN_API MyRunnable : public Runnable{ public: MyRunnable(); ~MyRunnable(); void Start() override; void Stop() override; private: // 状态机 enum class State { IDLE, RUNNING, PAUSED }; // 当前状态 State CurrentState; //依赖关系管理器 TSharedPtrDependencyManager; }; // MyRunnable.cpp#include "MyRunnable.h" MyRunnable::MyRunnable() { // 初始化状态机 CurrentState = State::IDLE; } MyRunnable::~MyRunnable() { } void MyRunnable::Start() { // 检查依赖关系是否满足 if (DependencyManager->IsDependenciesSatisfied()) { // 设置当前状态为运行中 CurrentState = State::RUNNING; // 执行任务逻辑 ExecuteTaskLogic(); } } void MyRunnable::Stop() { // 检查当前状态是否为运行中 if (CurrentState == State::RUNNING) { // 设置当前状态为停止 CurrentState = State::IDLE; // 停止任务逻辑 StopTaskLogic(); } } // MyDependencyManager.h#pragma once#include "CoreMinimal.h" class MYPLUGIN_API MyDependencyManager : public IObjectReference{ public: MyDependencyManager(); bool IsDependenciesSatisfied() const; }; // MyDependencyManager.cpp#include "MyDependencyManager.h" MyDependencyManager::MyDependencyManager() { } bool MyDependencyManager::IsDependenciesSatisfied() const{ // 检查依赖关系是否满足 return true; //依赖关系满足}
在上述示例代码中,我们创建了一个 `MyRunnable` 类来对 `Runnable` 进行封装。这个类提供了一些基本的功能,如线程管理、状态管理和依赖关系管理。
我们还创建了一个 `MyDependencyManager` 类来管理不同 `Runnable` 实例之间的依赖关系。
**3. 如何使用 MyRunnable 来进行多线程编程?**
在 UE4/5 中,我们可以使用 `MyRunnable` 来进行多线程编程。例如,我们可以使用以下代码来启动一个 `MyRunnable` 实例:
cpp// 在 MyRunnable.h 中添加以下函数void StartMyRunnable(); // 在 MyRunnable.cpp 中实现以下函数void MyRunnable::StartMyRunnable() { // 创建一个 MyRunnable 实例 TSharedPtrRunnable = MakeShareable(new MyRunnable()); // 启动 MyRunnable 实例 Runnable->Start(); }
在上述示例代码中,我们创建了一个 `StartMyRunnable` 函数来启动一个 `MyRunnable` 实例。
我们可以使用以下代码来停止一个 `MyRunnable` 实例:
cpp// 在 MyRunnable.h 中添加以下函数void StopMyRunnable(); // 在 MyRunnable.cpp 中实现以下函数void MyRunnable::StopMyRunnable() { // 检查当前状态是否为运行中 if (CurrentState == State::RUNNING) { // 停止 MyRunnable 实例 Runnable->Stop(); } }
在上述示例代码中,我们创建了一个 `StopMyRunnable` 函数来停止一个 `MyRunnable` 实例。
**4. 总结**
在本文中,我们学习了如何对 `Runnable` 进行封装,以便更好地管理多线程逻辑,并且使得我们的插件更加易于维护和扩展。
我们创建了一个 `MyRunnable` 类来对 `Runnable` 进行封装,提供了一些基本的功能,如线程管理、状态管理和依赖关系管理。
我们还学习了如何使用 `MyRunnable` 来进行多线程编程,例如启动和停止一个 `MyRunnable` 实例。
最后,我们总结了本文中所学到的知识,并且提供了一些示例代码来帮助读者更好地理解。