콜백 함수 및 용도
1 콜백 함수 개요
콜백 함수는 호출자가 객체를 초기화할 때 객체에 일부 매개변수를 전달하는 동시에 호출자가 액세스할 수 있는 함수를 전달하는 메커니즘입니다(여기서 객체는 OOP, 전역 함수 등의 객체를 나타냅니다). . 주소가 개체에 전달됩니다. 이 함수는 호출자와 호출 수신자 간의 알림 계약입니다. 합의된 이벤트가 발생하면 호출 수신자(보통 작업 스레드 포함)는 콜백 함수 주소에 따라 함수를 호출합니다.
이렇게 하면 호출자는 한 스레드에 있고 호출 수신자는 다른 스레드에 있습니다. 메시지: 메시지는 초기화 중에 호출자가 호출자에게 전달하기 때문에 일종의 콜백으로 간주될 수도 있습니다. 핸들과 메시지 번호, 호출자는 합의된 이벤트가 발생할 때 호출자에게 메시지를 보냅니다.
이러한 방식으로 호출자는 기본 스레드에 있고 호출 수신자는 기본 스레드 또는 작업자 스레드에 있습니다. 델파이 이벤트 모델:
TForm의 OnCreate 이벤트와 같이 Delphi의 VCL에는 이벤트 모델을 사용하는 많은 시각적 구성 요소가 있습니다. 원칙은 디자인 타임에 이벤트 함수를 지정하고 이벤트가 런타임에 트리거될 때 디자인 타임에 지정된 이벤트 함수가 호출된다는 것입니다. . 기계적으로 델파이 이벤트 모델은 콜백과 동일합니다. 그러나 구체적인 형태에는 약간의 차이가 있습니다. 순수 콜백 함수는 전역 함수 형태인 반면, 델파이 이벤트는 객체 메소드 형태입니다. 즉, 다음과 같은 콜백 함수 유형을 정의할 수 있습니다. TCallBackFunc = 개체의 PRocedure(pData: 포인터);
2 콜백 함수 사용 지침
콜백 함수는 주로 두 가지 상황에서 사용됩니다. 첫 번째는 일부 Windows API에서 콜백 함수를 매개변수 주소로 요구하는 것이고, 다른 하나는 특정 상황에서 사용자가 정의한 함수가 콜백 함수를 매개변수로 필요로 한다는 것입니다. , 사용자 정의 함수의 경우 일반적으로 동적 링크 라이브러리에서 함수를 호출할 때 사용됩니다. 콜백 함수를 사용하는 데는 몇 가지 주요 단계가 있습니다. 1. 콜백 함수 유형을 정의하는 것은 일반 함수 프로세스의 정의와 다르지 않지만, 콜백 함수의 정의는 필요에 따라 콜백 함수의 함수 요구 사항을 충족해야 한다는 점만 다릅니다. in 함수 또는 프로시저 정의 다음에는 Windows 표준 호출이라는 선언이 와야 합니다. 예: typeTHDFunction= function(I:integer;s:string):integer; THDProcedure=프로시저(s:string); stdcall;2. 그런 다음 이 프로토타입을 기반으로 해당 함수 또는 프로세스를 정의합니다. 함수 또는 프로세스의 이름에 대한 요구 사항은 없습니다. 함수의 매개 변수 유형과 반환 값의 유형은 정의된 콜백과 완전히 일치해야 합니다. 함수 유형입니다. 프로시저의 경우 매개변수 유형만 동일하면 됩니다. 예: 위 함수와 프로세스의 프로토타입을 기반으로 해당 기능과 해당 프로세스를 정의합니다. 함수 프로토타입 정의: Function HdFunExample(k:integer,sExam:string):integer; stdcall; 프로세스 정의: Procedure HdProExample(sExam:string);stdcall; 3. 프로그램에서 이 콜백 함수 또는 프로시저를 구현합니다. 정수,sExam:문자열):정수;BeginEnd;프로시저 HdProExample(sExam:string);stdcall;beginend; 4. 콜백 함수는 일반적으로 호출 함수의 프로토타입에 따라 시스템의 특정 함수의 항목 주소로 사용됩니다. 함수: 함수 DyHdFunExample(HdFun:THDFunction;I: 정수):부울; 호출함수에서는 함수포인터를 처리하여 콜백함수를 직접 호출할 수 있으므로(즉, 호출함수에서의 매개변수는 콜백함수형 매개변수이고 직접 연산됨) 콜백함수는 특정 작업을 수행하게 된다. 즉, 콜백 함수의 기능이 호출 함수에 구현됩니다. 호출: varI:integer;beginI:=DyHdFunExample(@HdFunExample,i);//…….End;
3가지 예시
샘플 프로그램은 H:/callback functionexamples/ 디렉터리에 있습니다. 콜백 함수의 사용은 주로 Windows의 원래 API 함수에 있지만 사용자 정의 호출 함수는 일반적으로 동적 링크 라이브러리에 있습니다. 일반적으로 동일한 프로젝트에서 콜백 함수를 사용할 필요는 없습니다. (개인적인 생각)...