Rückruffunktionen und ihre Verwendung
1 Übersicht über Callback-Funktionen
Die Rückruffunktion ist ein Mechanismus, bei dem der Aufrufer beim Initialisieren eines Objekts einige Parameter an das Objekt übergibt (das Objekt bezieht sich hier auf Objekte in OOP, globale Funktionen usw.) und gleichzeitig eine Funktion übergibt, auf die der Aufrufer zugreifen kann . Die Adresse wird an das Objekt übergeben. Bei dieser Funktion handelt es sich um eine Benachrichtigungsvereinbarung zwischen dem Anrufer und dem Angerufenen. Wenn das vereinbarte Ereignis eintritt, ruft der Angerufene (normalerweise einschließlich eines Arbeitsthreads) die Funktion entsprechend der Rückruffunktionsadresse auf.
Auf diese Weise befindet sich der Aufrufer in einem Thread und der Angerufene in einem anderen Thread. Nachricht: Eine Nachricht kann auch als eine Art Rückruf angesehen werden, da die Nachricht während der Initialisierung auch vom Anrufer an den Angerufenen übergeben wird. Ein Handle und eine Nachrichtennummer, der Angerufene sendet eine Nachricht an den Anrufer, wenn das vereinbarte Ereignis eintritt.
Auf diese Weise befindet sich der Aufrufer im Hauptthread und der Angerufene im Hauptthread oder Arbeitsthread. Delphi-Ereignismodell:
Es gibt viele visuelle Komponenten in der VCL von Delphi, die Ereignismodelle verwenden, z. B. das OnCreate-Ereignis von TForm. Das Prinzip lautet: Geben Sie die Ereignisfunktion zur Entwurfszeit an. Wenn das Ereignis zur Laufzeit ausgelöst wird, wird die zur Entwurfszeit angegebene Ereignisfunktion aufgerufen . Mechanisch gesehen ist das Delphi-Ereignismodell dasselbe wie Callbacks. Es gibt jedoch einige Unterschiede in den spezifischen Formen. Eine reine Callback-Funktion hat die Form einer globalen Funktion, während ein Delphi-Ereignis die Form einer Objektmethode hat. Das heißt, der folgende Callback-Funktionstyp kann definiert werden TCallBackFunc = PROcedure (pData: Pointer) des Objekts;
2 Anleitung zur Nutzung von Callback-Funktionen
Die Rückruffunktion wird hauptsächlich in zwei Situationen verwendet: Zum einen benötigen einige Windows-APIs die Rückruffunktion als Parameteradresse, zum anderen erfordert eine vom Benutzer in einem bestimmten Anlass definierte Funktion die Rückruffunktion als Parameteradresse , für benutzerdefinierte Funktionen, wird im Allgemeinen beim Aufrufen von Funktionen in dynamischen Linkbibliotheken verwendet. Es gibt mehrere Hauptschritte für die Verwendung einer Rückruffunktion: 1. Die Definition eines Rückruffunktionstyps unterscheidet sich nicht von der Definition eines allgemeinen Funktionsprozesses, seine Definition muss jedoch bei Bedarf die Funktionsanforderungen der Rückruffunktion erfüllen. Der einzige Unterschied besteht darin Im Anschluss an die Definition einer Funktion oder Prozedur muss angegeben werden, dass es sich um einen Windows-Standardaufruf handelt: typeTHDFunction= function(I:integer;s:string):stdcall; THDProcedure=procedure(s:string); stdcall;2. Definieren Sie dann eine entsprechende Funktion oder einen entsprechenden Prozess. Es gibt keine Anforderungen an den Namen dieser Funktion oder dieses Prozesses. Der Typ der Parameter der Funktion und der Typ des Rückgabewerts müssen vollständig mit dem definierten Rückruf übereinstimmen Für Prozeduren muss es sich lediglich um denselben Parametertyp handeln. Beispiel: Definieren Sie eine entsprechende Funktion und einen entsprechenden Prozess basierend auf dem Prototyp der oben genannten Funktion und des obigen Prozesses. Funktionsprototypdefinition: Function HdFunExample(k:integer,sExam:string):integer; stdcall; Prozessdefinition: procedure HdProExample(sExam:string); 3. Implementieren Sie diese Callback-Funktion oder -Prozedur im Programm; integer,sExam:string):integer; stdcall;BeginEnd;procedure HdProExample(sExam:string);stdcall;beginend; 4. Aufrufprozess; Die Callback-Funktion wird im Allgemeinen als Einstiegsadresse einer bestimmten Funktion im System verwendet: Angenommen, es gibt den folgenden Aufruf Funktion: function DyHdFunExample(HdFun:THDFunction;I: integer):boolean; In der aufrufenden Funktion kann die Rückruffunktion direkt aufgerufen werden, indem der Funktionszeiger verarbeitet wird (dh der Parameter in der aufrufenden Funktion ist ein Parameter vom Typ der Rückruffunktion und wird direkt bedient), sodass die Rückruffunktion bestimmte Vorgänge ausführt. Das heißt, die Funktion der Rückruffunktion wird in der aufrufenden Funktion implementiert. Aufruf: varI:integer;beginI:=DyHdFunExample(@HdFunExample,i);//…….End;
3 Beispiele
Das Beispielprogramm befindet sich im Verzeichnis H:/callback function examples/. Die Verwendung von Rückruffunktionen erfolgt hauptsächlich in den ursprünglichen API-Funktionen von Windows, die benutzerdefinierten Aufruffunktionen befinden sich jedoch im Allgemeinen in dynamischen Linkbibliotheken. Im Allgemeinen ist es nicht erforderlich, Rückruffunktionen im selben Projekt zu verwenden. (Ich persönlich denke)...