jywhy6
(yy j)
1
In a plugin whose code is not on game thread, I want to use some functions from EditorAssetLibrary
, which must be executed in game thread to work.
I tried the following code piece, but the whole engine GUI freezes. Seems that it is waiting for the task to complete foreverly.
FGraphEventRef Task = FFunctionGraphTask::CreateAndDispatchWhenReady([]()
{
// Do something in game thread
// Modify variable "Result"
}, TStatId(), nullptr, ENamedThreads::GameThread);
// Wait for the task
FTaskGraphInterface::Get().WaitUntilTaskCompletes(Task);
return Result;
Brannigan
(Brannigan)
2
Why do you want to wait on the task?
Could you instead give the task a delegate to call when complete to move your logic forward?
Make a static function in you .h file
static FGraphEventRef RunLambdaOnGameThread(TFunction< void()> InFunction);
In CPP
FGraphEventRef YouClassName::RunLambdaOnGameThread(TFunction< void()> InFunction)
{
return FFunctionGraphTask::CreateAndDispatchWhenReady(InFunction, TStatId(), nullptr, ENamedThreads::GameThread);
}
Now you can run a function on the game thread.
void YourClassName::YourFunc(params)
{
RunLambdaOnGameThread([capture any vars by ref or by value] {
// Your func Implementation
});
}
Hope this helps.
2 Likes