October3d55/Matain/SocketIOClient/Source/CoreUtility/Public/CULambdaRunnable.h

73 lines
2.0 KiB
C++

// Copyright 2018-current Getnamo. All Rights Reserved
#pragma once
#include "Engine/LatentActionManager.h"
#include "LatentActions.h"
#include "Async/TaskGraphInterfaces.h"
/** A simple latent action where we don't hold the value, expect capturing value in lambdas */
class COREUTILITY_API FCULatentAction : public FPendingLatentAction
{
public:
TFunction<void()> OnCancelNotification = nullptr;
/** Note that you need to use the resulting call to cleanly exit */
static FCULatentAction* CreateLatentAction(struct FLatentActionInfo& LatentInfo, UObject* WorldContext);
FCULatentAction(const FLatentActionInfo& LatentInfo);
virtual void UpdateOperation(FLatentResponse& Response) override;
void Call();
void Cancel();
virtual void NotifyObjectDestroyed() override;
virtual void NotifyActionAborted() override;
#if WITH_EDITOR
virtual FString GetDescription() const override;
#endif
const FName ExecutionFunction;
const int32 OutputLink;
const FWeakObjectPtr CallbackTarget;
private:
bool Called;
};
/**
* Convenience wrappers for common thread/task work flow. Run background task on thread, callback via task graph on game thread
*/
class COREUTILITY_API FCULambdaRunnable
{
public:
/**
* Runs the passed lambda on the background thread, new thread per call
*/
static void RunLambdaOnBackGroundThread(TFunction< void()> InFunction);
/**
* Runs the passed lambda on the background thread pool
*/
static void RunLambdaOnBackGroundThreadPool(TFunction< void()> InFunction);
/**
* Runs a short lambda on the game thread via task graph system
*/
static FGraphEventRef RunShortLambdaOnGameThread(TFunction< void()> InFunction);
/**
* Runs a short lambda on background thread via task graph system
*/
static FGraphEventRef RunShortLambdaOnBackGroundTask(TFunction< void()> InFunction);
/**
* Runs a thread with idle for duration before calling back on game thread.
* Due to context cost recommended for >0.1sec durations.
*/
static void SetTimeout(TFunction<void()>OnDone, float DurationInSec, bool bCallbackOnGameThread = true);
};