2017-11-26 5 views
0

타사 라이브러리를 사용하여 독점적 파일을 여는 C++ 응용 프로그램을 작성하고 있습니다. 내 응용 프로그램에서 사용자는 다음과 같이 할 수 있습니다.함수 포인터가있는 C++ 콜백

int main(int argc, char* argv[]) { 
    CustomFileFormat f1; 
    f1.open("c:/file1.xyz"); 
    f1.process(); 

    CustomFileFormat f2; 
    f2.open("c:/file2.xyz"); 
    f2.process(); 

    Result r = f1.compare(f2); 
    r.generateReport(); 

    return 0; 
} 

문제는 process() 기능과 관련이 있습니다. 이 콜백 함수가 제 3 자 라이브러리에서 호출됩니다

typedef void (*FileProgressCallback)(double dProgress, bool& shouldAbort); 

처리 된 방법 파일의 많은 말해 (수신 :이 기능은 다음과 같이 정의 콜백 함수를 노출하는 제 3 자 라이브러리에 명령을 전송 dProgress 값은 0과 1 사이가 될 것입니다) 그리고 처리를 멈추게 할 수있는 shouldAbort bool 변수.

문제는 process() 함수를 코딩하는 방법을 모르므로 콜백을 호출 할 때 반환되는 결과가 인스턴스 f1인지 인스턴스 f2인지 여부를 알 수 있도록하는 것입니다. 내 CustomFileFormat 클래스의 멤버 함수를 정의 할 수 있습니까? 그렇다면이 클래스를 호출 할 때 어떤 것이 사용되고 있는지 알 수 있습니까?

+0

현재 인스턴스를 사용하여 정적 또는 전역 변수를 만들면 개체의 인스턴스가 재생되는 것을 어떻게 든 기록해야합니다. – PaulMcKenzie

답변

0

간단한 방법은 .process() 호출 전에 일부 컨텍스트로 전역 설정을 지정하는 것입니다. 전역 스택을 만들면 재귀 적 처리도 수행 할 수 있습니다 (설명 된대로 그것이 필요한 것의 일부 임).

더 복잡한 대답은 libffi의 클로저와 같은 것을 사용하는 것입니다 (라이브러리는 https://sourceware.org/libffi/ 또는 https://github.com/libffi/libffi에서 사용 가능함). 라이브러리의 해당 부분은 호출자로부터받은 매개 변수와 추가 매개 변수를 연관시킬 수있는 런타임시 코드의 작은 비트를 생성합니다.

+0

전역을 사용하는 것을 고려하고 있었지만 두 개의 다른 스레드에서 두 개의 다른 인스턴스에 대해 process()를 실행할 수 없다는 것을 의미합니다. –

+0

둘 이상의 스레드에서이 작업을 동시에 수행해야하는 경우 전역 스레드를 로컬로 만들 수 있습니다. – SoronelHaetir

관련 문제