비동기 호출을 위한 함수 객체
DKFunctionSignature
template <typename Function> struct DKFunctionSignature;
- 함수 시그니처 객체
- 전역 함수, 클래스 멤버 함수, 람다(lambdas)함수 등 모든 함수를 담을 수 있다.
- 모든 함수는 동일한 리턴값과 파라메터로 동일한 Signature 를 가진다.
- 예:
// 아래는 모두 DKFunctionSignature<void (int, char)> 가 될 수 있다. void Func(int, char); // 전역 함수 void MyClass::MemberFunc(int, char); // 클래스 멤버 함수 [&](int, char) { ... } // 함수객체 (람다) // sig1, sig2, sig3 는 모두 동일한 signature 타입 DKObject<DKFunctionSignature<void (int, char)> sig1 = DKFunction(Func); DKObject<DKFunctionSignature<void (int, char)> sig2 = DKFunction(MyClass(), &MyClass::MemberFunc); DKObject<DKFunctionSignature<void (int, char)> sig3 = DKFunction([&](int, char){});
- 함수를 호출할수 있다.
- 나중에 (혹은 다른 쓰레드에서) 호출할 수 있는 함수객체를 생성할 수 있다.
- DKInvocation 객체는 결과를 리턴한다.
- DKOperation 는 리턴하지 않는다.
- 한번 만들어둔 함수객체는 여러번 사용 가능
- 파라메터를 미리 담아두고 호출
- 파라메터 life-cycle 에 주의할것
- 아래의 함수를 통해서 생성이 가능
- DKFunction( with function pointer )
- DKFunction( with function object or lambda )
- DKFunction( an object reference or pointer, member function pointer )
DKInvocation
template <typename T> struct DKInvocation : public DKOperation;
- Perform() 호출시 T 형식의 값 리턴
- 함수객체를 가질수도 있고 변수나 상수를 가질수도 있다.
- DKValue 로 변수 바인딩 가능
- 모든 Invocation 객체는 Operation 객체 (IsA)
DKOperation
- opaque 함수 객체
- Perform() 호출시 무언가를 한다.
- 결과를 돌려주지 않음
DKFunction
- 함수나 함수객체, 클래스 멤버함수로부터 DKFunctionSignature 객체를 생성한다.
사용 예제
void func(int) {..} // DKFunction 함수를 통해 FunctionSignature 객체를 생성 auto sig = DKFunction(&func); sig->Invoke(3); // 직접 호출 // Invocation(Operation) 객체를 생성 auto op = sig->Invocation(3); sig = NULL; // sig 객체를 삭제해도, op 은 계속 유효함 op->Perform(); // op 의 함수 호출 // lambdas 도 FunctionSignature 생성 가능 auto sig = DKFunction( [](int) { ... } ); sig->Invoke(3); // 클래스 객체로부터 생성 auto sig = DKFunction(MyObject, &MyClass::Function); // 인스턴스 바로 생성 (on-the-fly) auto sig = DKFunction(AClass(), &AClass::Function); // EventLoop 를 이용한 지연 호출 DKEventLoop::CurrentEventLoop()->Post(op, 3.0); // 3초 후에 op 를 호출한다. // OperationQueue 를 이용한 다중쓰레드 호출 DKOperationQueue queue; queue.Post(op); // 다른 쓰레드에서 호출 (async) queue.Process(op); // 다른 쓰레드에서 호출후 리턴 (sync)