==前言==
之前尝试在Tick中遍历整个ULevel中的Actor,并取每个Actor的Type name的时候,发现获取到20+个的时候,UE4就会崩溃【也许是遍历到自己然后访问到自己了.....总之不明情况
于是尝试多次无果的情况下,准备直接上多线程
然后查doc
发现官方doc上对多线程的描述比较少,能查到的wiki只有两篇:
https://wiki.unrealengine.com/Multi-Threading:_How_to_Create_Threads_in_UE4
https://wiki.unrealengine.com/Multi-Threading:_Task_Graph_System
感觉写的不是太明白,于是开始自己研究【这是个错误的决定_(:з」∠)_
......
于是就有下面这篇教程了

==正文==
我的目标是写一个很简单的factory
主要的功能有create、remove、run、stop、exit
create时传入要使用多线程的类的指针、要在多线程中被执行的函数和线程的名字
remove、run、stop、exit都使用线程名来操作

首先说一下UE4中常用的多线程类:
FRunnableThread和FRunnable
https://docs.unrealengine.com/latest/INT/API/Runtime/Core/HAL/FRunnableThread/index.html
https://docs.unrealengine.com/latest/INT/API/Runtime/Core/HAL/FRunnable/index.html
使用FRunnableThread类的Create成员函数来创建一个新线程
创建需要传入一个FRunnable对象
可以通过override掉FRunnable类的Run、Exit等成员函数,来达到自定义功能
创建完毕后,可以通过调用FRunnable类的Run等成员函数让其在新的线程中运行
【其实就是调用个Run然后Run就在新的线程中运行了

具体的设计思路:
创建一个MultiThread类,为factory
在MultiThread类中创建一个内部类:ThreadClass,ThreadClass继承FRunnable,override了Run成员函数,ThreadClass同时存放着FRunnableThread Create返回的FRunnableThread对象的指针、要使用多线程的对象的指针和要在新线程中运行的函数的指针
MultiThread中还含有一个Map用于储存创建出来的所有的ThreadClass对象
在MultiThread中定义一系列的操作的函数

代码:
==========MultiThread.h==========

#pragma once

class [ProjectName]_API MultiThread {
public:
// 构造函数

MultiThread() = default;

// 析构函数
~MultiThread() = default;

public:
// 创建一个新线程
template <typename T>
static void create(T *objectPointer, void(T::*functionPointer)(void), FString threadName) {
// 创建新线程实例
ThreadClass tempThreadObject(objectPointer, functionPointer, threadName);
// 存入线程列表
MultiThread::threadList.Add(threadName, tempThreadObject);
}

// 删一个线程
static void remove(FString threadName);

// 运行一个线程
static void run(FString threadName);

// 停止一个线程
static void stop(FString threadName);

// 退出一个线程
static void exit(FString threadName);

private:
// Thread class
class ThreadClass : public FRunnable {
public:
// 构造函数
template <typename T>
ThreadClass(T *objectPointer, void(T::*functionPointer)(void), FString threadName) {
// 存入要运行多线程的对象的指针
this->objectPointer = (UObject *)objectPointer;
// 存入要使用多线程的函数的指针
this->functionPointer = (void(UObject::*)(void))functionPointer;
// 创建一个新FRunnableThread对象
this->runnableThread = FRunnableThread::Create(this, *threadName, 0, TPri_BelowNormal, 0);
}

// 析构函数
~ThreadClass();

public:
// 运行
virtual uint32 Run() override;

private:
// 对象的指针
UObject *objectPointer = nullptr;

// 函数的指针
void(UObject::*functionPointer)(void) = nullptr;

// FRunnableThread对象的指针
FRunnableThread *runnableThread = nullptr;
};

private:
// 线程列表
static TMap<FString, ThreadClass> threadList;
};

==========MultiThread.cpp==========
#include "MultiThread.h"

// 线程列表
TMap<FString, MultiThread::ThreadClass> MultiThread::threadList;

// 运行线程
void MultiThread::run(FString threadName) {
MultiThread::ThreadClass *tempThread = MultiThread::threadList.Find(threadName);
if (tempThread) {
tempThread->Run();
}
}

// 删除线程
void MultiThread::remove(FString threadName) {
MultiThread::ThreadClass *tempThread = MultiThread::threadList.Find(threadName);
if (tempThread) {
delete tempThread;
MultiThread::threadList.Remove(threadName);
}
}

// 停止
void MultiThread::stop(FString threadName) {
MultiThread::ThreadClass *tempThread = MultiThread::threadList.Find(threadName);
if (tempThread) {
tempThread->Stop();
}
}

// 退出
void MultiThread::exit(FString threadName) {
MultiThread::ThreadClass *tempThread = MultiThread::threadList.Find(threadName);
if (tempThread) {
tempThread->Exit();
}
}

// 析构函数
MultiThread::ThreadClass::~ThreadClass() {
this->objectPointer = nullptr;
this->functionPointer = nullptr;
delete this->runnableThread;
this->runnableThread = nullptr;
}

// 运行
uint32 MultiThread::ThreadClass::Run() {
// 这个是关键点,要知道如何使用成员函数的指针
(this->objectPointer->*this->functionPointer)();
return 0;
}

调用的时候可以这样:
#include "MultiThread"
// ............
MultiThread::create(this, &MyClass::MyThread, "MyThread");
MultiThread::run("MyThread");
remove、exit、stop同理

==后记==
如果有不正确的地方欢迎指正w
不懂欢迎问ww
镇楼图和内容没半毛线关系【划掉
其实我只是水下经验,好久没冒泡应该没几个人记得我了www【划掉

UE4 C++使用Multi Theard的教程相关推荐

  1. UE4材质着色器全面学习教程

    你会学到什么 通过所有着色器类型和设计的实际演示,学习创建材质 要求 对虚幻的基本理解会有所帮助 了解纹理的一般知识(不仅限于UE4)也很有用 描述 在这个系列中,我将带你设置大量不同的材料,教你如何 ...

  2. UE4虚幻引擎关于小地图制作教程

    UE4虚幻引擎关于小地图制作教程 首先,要做一个这样子的效果! 怎么做呢! 首先,我们要准备UI! 小地图,我们的分辨率是512x512 记住参数! 然后在MainUI当中!我们就可以这么设置! 一个 ...

  3. 分享关于UE4中matinee工具的使用教程

    现代游戏语言的一个重要方面是过场动画.这些可以是长的或短的,使用游戏资源或电影,或者几乎任何你能想象到的东西.他们都有一个共同点,那就是他们被用来推动叙事.有时这可能是为了阻止玩家的控制,让他们观看故 ...

  4. UE4/UE5 使用Unreal Datasmith完全教程

    (2019.12.9)Datasmith功能已内置到虚幻4.24版本 Datasmith支持导入Twinmotion:Twinmotion教程汇总(2021.4.2) Datasmith安装到4.20 ...

  5. UE4打包成APK的详细教程(普通安卓应用,VR全景应用尚在探索中,之后若解决会更新)

    因为打包apk的学习过程中没有看到有哪篇文档是把全部流程完整描述出来的(就是给完完全全纯小白的博客,对官方文档的理解也不深的情况下)(也可能是我没搜到过吧)在没理解透的情况下走了很多弯路,这个过程确实 ...

  6. 【UE4】蓝图转为C++官方教程部分笔记

    动机 官方教学有将蓝图转为C++的教学视频,非常详细. 将蓝图转为C++ – Unreal Engine 为了方便查找知识点,特意在这里记了一部分笔记(图片都来自于本人的工程而非视频) 1. 蓝图和C ...

  7. [UE4]Fog Of War(战争迷雾)教程

    [TUTORIAL] Fog Of War https://forums.unrealengine.com/showthread.php?55650-TUTORIAL-Fog-Of-War

  8. ue4 开发动作游戏_ue4游戏开发虚幻4学习教程资源素材合集

    虚幻4 ue4商城 ue4场景 素材 模型 动作 蓝图 动画 2019最新超值合集资源包 游戏开发 2019最全素材 包含虚幻中国 荒岛求生案例视频教程 和官方中文翻译教程 UE4官方商城精品合集!含 ...

  9. 如何使用Xcode分析调试在真机运行的UE4 IOS版游戏

    http://www.cnblogs.com/TracePlus/p/4090227.html 写本文的是因为UE4 官方文档虽然也有,但主要讲的是是用UE4Editor把游戏打成一个IPA包的形式发 ...

最新文章

  1. b是python文件二进制打开_如何在Python中打开和显示原始二进制数据?
  2. nginx alias php 404,Nginx配置静态服务器以及404问题解决,root和alias的区别
  3. left join 和join区别_sleep、yield、join方法简介与用法 sleep与wait区别 多线程中篇
  4. clear linux安装教程,Clear Linux OS特性介绍,附下载地址
  5. linux 8002端口,linux – 如何限制反向SSH调整端口?
  6. 扫地机器人水箱背景_家友扫地机器人拖地水箱配件(米家扫地机器人1代版)体验(Case Closed)...
  7. PDF to Word Document Converter for Mac(PDF格式转换必备)
  8. 计算机网络-扩展路由器
  9. 协作中继认知无线电功率分配
  10. php表格好看样式,用html和css代码实现各种表格样式的总结
  11. 微信卡包系列-添加微信卡券优惠券
  12. 华为智慧屏的四大核心功能
  13. 【编程原则】预则立,不预则废
  14. ab的plc跟西门子哪个好些_周报61期 | 西门子全系列及博图软件常见问题解答
  15. Mac安装软件时提示“文件已损坏,您应该将它移到废纸篓”解决办法(亲测有效)
  16. Solr DIH dataConfig参数XXE漏洞
  17. android输入法中文在哪里设置,android输入法怎么设置中文
  18. 使用新浪微博sdk开发
  19. 【亲测】登录界面,拖动滑块验证
  20. 数学期望 极小值的几种求法

热门文章

  1. com 组件调用不起来_Spring Cloud Alibaba训练营 —— 分布式服务调用
  2. ubuntu jdk tomcat mysql_Ubuntu下JDK+Tomcat+MySql环境的搭建
  3. java基础知识点(6)——循环语句for-while
  4. win10 安装Pytorch GPU版+CUDA+cuDNN(篇幅较长保姆教程) (含CUDA11.1与cuDNN8.0.4安装包)
  5. zsh 使用通配符功能
  6. ip 包流量分析程序_【干货】西门子S7300六大流量异常场景检测
  7. python不带颜色的图形_python-Matplotlib添加基于现有颜色系列的图例
  8. 统计5个字符串回文个数c语言,第一章 字符串 – 1.5 最长回文子串 - 编程之法:面试和算法心得...
  9. websocket java8_Java API For WebSocket(八)服务器安全
  10. Java案例:数据表转换成XML文档