## page was renamed from DKFunction = 비동기 호출을 위한 함수 객체 = === DKFunctionSignature === {{{#!hightlight cpp numbers=disable template struct DKFunctionSignature; }}} * 함수 시그니처 객체 * 전역 함수, 클래스 멤버 함수, 람다(lambdas)함수 등 모든 함수를 담을 수 있다. * 모든 함수는 동일한 리턴값과 파라메터로 동일한 Signature 를 가진다. .예: {{{#!highlight cpp numbers=disable // 아래는 모두 DKFunctionSignature 가 될 수 있다. void Func(int, char); // 전역 함수 void MyClass::MemberFunc(int, char); // 클래스 멤버 함수 [&](int, char) { ... } // 함수객체 (람다) // sig1, sig2, sig3 는 모두 동일한 signature 타입 DKObject sig1 = DKFunction(Func); DKObject sig2 = DKFunction(MyClass(), &MyClass::MemberFunc); DKObject sig3 = DKFunction([&](int, char){}); }}} * 함수를 호출할수 있다. * 나중에 (혹은 다른 쓰레드에서) 호출할 수 있는 함수객체를 생성할 수 있다. * DKInvocation 객체는 결과를 리턴한다. * DKOperation 는 리턴하지 않는다. * 한번 만들어둔 함수객체는 여러번 사용 가능 * 파라메터를 미리 담아두고 호출 * 파라메터 life-cycle 에 주의할것 * 아래의 함수를 통해서 생성이 가능 {{{#!wiki dashed * DKFunction( with function pointer ) * DKFunction( with function object or lambda ) * DKFunction( an object reference or pointer, member function pointer ) }}} === DKInvocation === {{{#!highlight cpp numbers=disable template struct DKInvocation : public DKOperation; }}} * Perform() 호출시 T 형식의 값 리턴 * 함수객체를 가질수도 있고 변수나 상수를 가질수도 있다. * DKValue 로 변수 바인딩 가능 * 모든 Invocation 객체는 Operation 객체 (IsA) === DKOperation === * opaque 함수 객체 * Perform() 호출시 무언가를 한다. * 결과를 돌려주지 않음 === DKFunction === * 함수나 함수객체, 클래스 멤버함수로부터 DKFunctionSignature 객체를 생성한다. ==== 사용 예제 ==== {{{#!highlight cpp numbers=disable 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) }}}