일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | 3 | 4 | |||
5 | 6 | 7 | 8 | 9 | 10 | 11 |
12 | 13 | 14 | 15 | 16 | 17 | 18 |
19 | 20 | 21 | 22 | 23 | 24 | 25 |
26 | 27 | 28 | 29 | 30 | 31 |
- 선택정렬
- 알고리즘
- 언리얼가비지컬렉터
- UELOG
- 애셋로드
- moreeffectiveC++
- dataasset
- C++
- UE_LOG
- stl
- enumasByue
- 프로그래머스
- 데이터애셋
- BFS
- 크리티컬섹션
- 델리게이트
- 자료구조
- 람다
- 정렬
- 스마트포인터
- map
- 정렬알고리즘
- 람다사용정렬
- 약참조
- UE4 커스텀로그
- 강참조
- 언리얼엔진구조체
- C++최적화
- unorder_map
- UML관련
- Today
- Total
기억을 위한 기록들
[UE-CPP] AsyncTask 함수 본문
std에서 std::async라는 함수가 존재한다.
여러 갈래로 갈라져서 동시에 진행되어서 CPU를 조금 더 효율적으로 사용하기 위해서입니다.
즉, 프로그램을 비동기적(asynchronous) 실행을 하기 위해서이다.
해당 함수는 언리얼엔진에서 AsyncTask 함수라는걸 제공하고 있다. 보통은 아래와 같이 사용하고 있는데 뭔뜻인지 알수가 없어 찾아 보았다.
AsyncTask(ENamedThreads::GameThread, [SlotName, UserIndex, SavedDelegate, bSuccess]()
{
SavedDelegate.ExecuteIfBound(SlotName, UserIndex, bSuccess);
});
해당 함수의 엔진 코드는 이렇게 되어있고,
어떤 Taks를 생성해주고, 준비가 되면 생성해주고 dispatch 해줄 준비를 한거같다..
찾아보니 사실 언리얼에서 쓰레드를 사용 하는 방식에서는
https://daru-daru.tistory.com/49
위 블로그에서 알려준것처럼
namespace Thread
{
FGraphEventArray MultiThread_CompletionEvents;
class Task
{
public:
Task() {}
static const TCHAR* GetTaskName()
{
return TEXT("Task");
}
FORCEINLINE static TStatId GetStatId()
{
RETURN_QUICK_DECLARE_CYCLE_STAT(FVictoryTestTask, STATGROUP_TaskGraphTasks);
}
static ENamedThreads::Type GetDesiredThread()
{
return ENamedThreads::AnyThread;
}
static ESubsequentsMode::Type GetSubsequentsMode()
{
return ESubsequentsMode::TrackSubsequents;
}
void DoTask(ENamedThreads::Type currentThread, const FGraphEventRef& myCompletionGraphEvent)
{
UE_LOG(LogTemp, Log, TEXT("DoTask!"));
/*
To do...
*/
}
};
}
사용할 쓰레드 클래스를 만들고 TO DO에 채워준다... 그리고
void Excute_Thread()
{
MultiThread_CompletionEvents.Add(TGraphTask<Task>::CreateTask(NULL, ENamedThreads::GameThread).ConstructAndDispatchWhenReady());
}
쓰레드를 사용하면 DoTask함수를 실행 함수로 인식하기에 Task클래스와 같은 구조를 가져야한다.
쓰레드를 실행하는 코드는 위와 같으며, 위의 코드를 읽어들이는 순간 쓰레드가 실행된다.
쓰레드를 반복하여 사용하고 싶으면 위의 코드를 DoTask 함수에 넣으면 된다.
라고 해주셨으며, 그럼 다시 코드를 보면
쓰레드 만드는 과정이 같은데 FAsyncGraphTask 라는 구조체를 사용해서 Task를 만들었다.
해당 구조체는 TaskGraph 시스템에서 실행되는 비동기 함수의 기본 클래스 FAsyncGraphTaskBase를 상속 받고 있다.
라고 하길래 찾아가봤는데..
별 다른건 없었다.
대략 AsyncTask 라는 함수 자체는 병렬 스레드를 위해 파라미터 로 넘겨지는 스레드로 람다함수를 넘겨줘서 해당 스레드에서 넣은 함수를 호출해주는것이였다...