14#include "CoreMinimal.h"
28 MCRO_API
bool IsInThread(ENamedThreads::Type threadName);
34 template <CFunctionLike When>
35 requires (TFunction_ArgCount<When> == 0)
37 ENamedThreads::Type threadName,
38 TUniqueFunction<
void()>&& func, When&& when
41 else AsyncTask(threadName, [when = MoveTemp(when), func = MoveTemp(func)]
43 if (
auto keep = when()) func();
47 template <CFunctionLike When>
48 requires (TFunction_ArgCount<When> == 0)
51 if (IsInRenderingThread()) func(GetImmediateCommandList_ForRenderCommand());
54 ENQUEUE_RENDER_COMMAND(FMcroThreading)([when = MoveTemp(when), func = MoveTemp(func)](FRHICommandListImmediate& cmdList)
56 if (
auto keep = when()) func(cmdList);
61 template <CFunctorObject Function,
typename Result = TFunction_Return<Function>, CFunctionLike When>
63 TFunction_ArgCount<Function> == 0
64 && TFunction_ArgCount<When> == 0
67 ENamedThreads::Type threadName,
72 return MakeFulfilledPromise<Result>(func()).GetFuture();
74 TPromise<Result> promise;
75 auto future = promise.GetFuture();
77 AsyncTask(threadName, [when = MoveTemp(when), func = MoveTemp(func), promise = MoveTemp(promise)]()
mutable
79 if (
auto keep = when()) promise.SetValue(func());
80 else promise.SetValue({});
85 template <CFunctorObject Function,
typename Result = TFunction_Return<Function>, CFunctionLike When>
87 TFunction_ArgCount<Function> == 1
88 && CSameAs<FRHICommandListImmediate&, TFunction_Arg<Function, 0>>
89 && TFunction_ArgCount<When> == 0
92 ENamedThreads::Type threadName,
96 if (IsInRenderingThread())
97 return MakeFulfilledPromise<Result>(func(GetImmediateCommandList_ForRenderCommand())).GetFuture();
99 TPromise<Result> promise;
100 auto future = promise.GetFuture();
102 ENQUEUE_RENDER_COMMAND(FMcroThreading)([when = MoveTemp(when), func = MoveTemp(func), promise = MoveTemp(promise)](FRHICommandListImmediate& cmdList)
mutable
104 if (
auto keep = when())
105 promise.SetValue(func(cmdList));
106 else promise.SetValue({});
117 MCRO_API
void RunInThread(ENamedThreads::Type threadName, TUniqueFunction<
void()>&& func);
124 MCRO_API
void RunInThread(ENamedThreads::Type threadName,
const UObject* boundToObject, TUniqueFunction<
void()>&& func);
131 MCRO_API
void RunInThread(ENamedThreads::Type threadName,
const FWeakObjectPtr& boundToObject, TUniqueFunction<
void()>&& func);
144 MCRO_API
void RunInGameThread(
const UObject* boundToObject, TUniqueFunction<
void()>&& func);
151 MCRO_API
void RunInGameThread(
const FWeakObjectPtr& boundToObject, TUniqueFunction<
void()>&& func);
164 MCRO_API
void EnqueueRenderCommand(
const UObject* boundToObject, TUniqueFunction<
void(FRHICommandListImmediate&)>&& func);
171 MCRO_API
void EnqueueRenderCommand(
const FWeakObjectPtr& boundToObject, TUniqueFunction<
void(FRHICommandListImmediate&)>&& func);
178 template <CSharedOrWeak Object>
179 void RunInThread(ENamedThreads::Type threadName,
const Object& boundToObject, TUniqueFunction<
void()>&& func)
184 return weakObject.Pin();
179 void RunInThread(ENamedThreads::Type threadName,
const Object& boundToObject, TUniqueFunction<
void()>&& func) {
…}
193 template <CSharedOrWeak Object>
204 template <CSharedOrWeak Object>
205 void EnqueueRenderCommand(
const Object& boundToObject, TUniqueFunction<
void(FRHICommandListImmediate&)>&& func)
210 return weakObject.Pin();
220 CFunctorObject Function,
235 CSharedOrWeak Object,
236 CFunctorObject Function,
240 TFuture<Result>
PromiseInThread(ENamedThreads::Type threadName,
const Object& boundToObject, Function&& func)
245 return weakObject.Pin();
240 TFuture<Result>
PromiseInThread(ENamedThreads::Type threadName,
const Object& boundToObject, Function&& func) {
…}
256 CFunctorObject Function,
260 TFuture<Result>
PromiseInThread(ENamedThreads::Type threadName,
const Object* boundToObject, Function&& func)
264 return IsValid(boundToObject) ? TStrongObjectPtr(boundToObject) :
nullptr;
260 TFuture<Result>
PromiseInThread(ENamedThreads::Type threadName,
const Object* boundToObject, Function&& func) {
…}
274 CFunctorObject Function,
289 CSharedOrWeak Object,
290 CFunctorObject Function,
299 return weakObject.Pin();
310 CFunctorObject Function,
318 return IsValid(boundToObject) ? TStrongObjectPtr(boundToObject) :
nullptr;
328 CFunctorObject Function,
333 && CSameAs<FRHICommandListImmediate&, TFunction_Arg<Function, 0>>
346 CSharedOrWeak Object,
347 CFunctorObject Function,
352 && CSameAs<FRHICommandListImmediate&, TFunction_Arg<Function, 0>>
359 return weakObject.Pin();
370 CFunctorObject Function,
375 && CSameAs<FRHICommandListImmediate&, TFunction_Arg<Function, 0>>
381 return IsValid(boundToObject) ? TStrongObjectPtr(boundToObject) :
nullptr;
typename TFunctionTraits< std::decay_t< T > >::Return TFunction_Return
Shorthand for getting a function return type.
constexpr size_t TFunction_ArgCount
Shorthand for getting a function argument count.
Utilities for TSharedPtr/Ref and related.
TWeakPtr< typename T::ElementType, T::Mode > TWeakPtrFrom
Copy thread-safety from other shared object type.
void RunInThreadBoilerplate(ENamedThreads::Type threadName, TUniqueFunction< void()> &&func, When &&when)
TFuture< Result > EnqueueRenderPromiseBoilerplate(ENamedThreads::Type threadName, Function &&func, When &&when)
void EnqueueRenderCommandBoilerplate(TUniqueFunction< void(FRHICommandListImmediate &)> &&func, When &&when)
TFuture< Result > PromiseInThreadBoilerplate(ENamedThreads::Type threadName, Function &&func, When &&when)
MCRO_API auto GetThreadCheck(ENamedThreads::Type threadName) -> bool(*)()
MCRO_API void RunInGameThread(TUniqueFunction< void()> &&func)
Simply run a lambda function on the game thread but only use AsyncTask if it's not on the game thread...
MCRO_API bool IsInThread(ENamedThreads::Type threadName)
Returns true when called in the thread which is associated with the given ENamedThreads....
MCRO_API void EnqueueRenderCommand(TUniqueFunction< void(FRHICommandListImmediate &)> &&func)
Simply run a lambda function on the render thread but only use AsyncTask if it's not on the render th...
TFuture< Result > EnqueueRenderPromise(Function &&func)
Simply run a lambda function on the render thread but only use AsyncTask if it's not on the render th...
TFuture< Result > PromiseInGameThread(Function &&func)
Simply run a lambda function on the game thread but only use AsyncTask if it's not on the game thread...
TFuture< Result > PromiseInThread(ENamedThreads::Type threadName, Function &&func)
Simply run a lambda function on the selected thread but only use AsyncTask if it's not on the selecte...
MCRO_API void RunInThread(ENamedThreads::Type threadName, TUniqueFunction< void()> &&func)
Simply run a lambda function on the selected thread but only use AsyncTask if it's not on the selecte...