Differences between revisions 7 and 8
Revision 7 as of 2019-05-09 08:00:49
Size: 3331
Editor: Tiff
Comment:
Revision 8 as of 2019-06-12 08:03:21
Size: 3368
Editor: Tiff
Comment:
Deletions are marked like this. Additions are marked like this.
Line 1: Line 1:
## page was renamed from DKFunction

비동기 호출을 위한 함수 객체

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)
    
    

FunctionObject (last edited 2019-06-12 08:03:21 by Tiff)