UE4笔记-进程/线程/网络/IO模块的相关问题记录

吐槽:如果有Qt的开发经验,会发现其实在比较底层编程理念UE4和Qt极其相识.很多类名和用法甚至都是相同的.

Q.创建线程类:

  UE4文档没有特别介绍关于线程模块的文章,这里自己简单记录一下,备查.

 

目前来说UE4的线程模块还是比较简陋的,命名风格像C#和Qt的结合体-_,-

 

UE4的线程的有两种比较常用的方式:

1.异步编程便捷帮助函数

2.自定义线程类

  有复杂线程逻辑、涉及线程通讯的,的用自定义类.简单的用便捷帮助函数即可

 

说明:

1.异步编程便捷帮助函数

跟C#的异步编程Task类基本一致.

主要涉及的相关函数和类:

 

Asyncwait
AsyncThreadwait
AsyncTaskwait
AsyncPoolwait

 

 

 

 

 

例子:

wait

2.自定义线程类:

自定义线程类:一般UE4线程主要涉及FRunnableThread类和FRunnable类

FRunnableThread用于管理线程实例(如创建、暂停,销毁等)

FRunnable则是用于实现线程逻辑的具体实现(继承方式)

有三个虚函数和一个纯虚函数

    Init() 初始化调用

    Stop() //暂停时调用

  Exit() 结束时调用
  Run() //运行时调用
会按照线程状态依次执行.

用到线程的话,难免会涉及到互斥锁:

UE4的互斥锁是:FCriticalSection类。

FCriticalSection还有与之相关个FScopeLock类

FScopeLock主要是防止线程异常抛出异常死锁的.

 最后说明一下,和Qt/C# 一样,只有Run函数体里面的代码和New的变量,属于子线程.而FRunnable类对象本身是属于创建他的线程的

这里列一个我用于IO本地图片的Thread栗子:

.h

class FThread_IO : public FRunnable
{
public:
    FThread_IO();
    ~FThread_IO();
public:
    bool Init() override{ return true; }
    uint32 Run() override;
    void Stop() override{} 
   void Exit override();
  TArray<FData_LoadTexture2DCommand> arr_waitLoadFile; 
};

 

.cpp

FThread_IO::FThread_IO()
{
}

FThread_IO::~FThread_IO()
{
    this->Stop();
}

uint32 FThread_IO::Run()
{
    /** 进行本地图片的IO读取处理 线程 */
    static int i= 1;
    static int iWidth, iHeight;
    static UIOHelper *helper = NewObject<UIOHelper>();
    while (true)
    {
        FCriticalSection Thread_lock;
        if (arr_waitLoadFile.Num() > 0)
        {
            i++;
            Thread_lock.Lock();
            bool bvaild = false;
            auto command = arr_waitLoadFile[0];
            arr_waitLoadFile.RemoveAt(0);
            auto tue = helper->LoadTexture2D_FromFile(command.target_UIItem->ImageLocalFilePath, EJoyImageFormats::JPG, bvaild, iWidth, iHeight);

            command.target_UIItem->SetImage_texture(tue);
            GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, FString::Printf(TEXT(" load finished : %d"), arr_waitLoadFile.Num()));
            Thread_lock.Unlock();
        }
        else
        {
            FPlatformProcess::Sleep(0.03f);
        }
    }
    

    return 0;
}

void FThread_IO::Exit()
{
    GEngine->AddOnScreenDebugMessage(-1, 5.0f, FColor::Red, TEXT(" thread finished"));
}

创建线程实例:

FString newThreadName("MyThread");
FThread_IO *thread_ResReader = nullptr;
auto mgr = FRunnableThread::Create(thread_ResReader, newThreadName.GetCharArray().GetData(), 0, TPri_BelowNormal);

 

Q.创建进程,打开额外程序方法:

FPlatformProcess::CreateProc(TEXT("程序路径");

Q.UE4进程通讯(Pipe):

以Window net form 为例:

wait

转载于:https://www.cnblogs.com/linqing/p/5767359.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值