Callback-Funktion - Sinn

Hallo!

Ich hab gerade mehrere Beschreibungen von Callback-Funktionen gelesen, was ich aber noch immer nicht verstanden habe ist der Sinn davon.

Also ich weiß, dass eine Callbackfunktion einer anderen Funktion als Argument übergeben wird. Diese andere Funktion kann die Callbackfunktion dann aufrufen.

Warum aber muss ich die Funktion als Argument übergeben und rufe sie nicht direkt in der anderen Funktion auf - ohne sie als Argument zu übergeben?

Wer kann mich da aufklären? Danke schon jetzt mal!

lg
Daniel

Moien

Ich hab gerade mehrere Beschreibungen von Callback-Funktionen
gelesen, was ich aber noch immer nicht verstanden habe ist der
Sinn davon.

Netzwerk.bitteInformierMichWennDatenAnkommen(callbackFunktion) ?

Ich weiss nicht wann und ob Daten ankommen. Ich weiss nicht wann „callbackFunktion“ aufgerufen werden soll. Das Betriebssystem, resp. das Netzwerksystem merkt es aber ganz genau. Und kann mir dann Bescheid geben.

cu

Aber diese bitteInformierMich-Funktion muss ja auch ausprogrammiert sein und die Callback-Funktion muss darin auch an einer bestimmten Stelle aufgerufen werden, oder nicht? Was genau hat das denn mit dem Betriebssystem zu tun, wird denn die Callback-Funktion automatisch aufgerufen?

Ich glaub jetzt bin ich noch verwirrter als vorher :wink:

lg

Callbacks dienen dazu eine zur Compile-Zeit unbekannte Methode aufzurufen. Die InformiereMich(Callback cb) ist schon ein gutes Beispiel. Wenn in einer Bibliothek diese Funktion ist, so will der Programmierer, der diese Bibliothek nutzt, ja eine von ihm definierte Methode aufgerufen haben. Was nutzt es mir, wenn ich weiß, dass bei Netzwerk-Aktivitäten die Methode „NetzwerkAktiviätRegistriert()“ in der WindowsNetzwerkSystem.dll aufgerufen wird, wenn es eine Methode in meinem Programm sein soll.

Grüße, JasonDelife.

Moien

Aber diese bitteInformierMich-Funktion muss ja auch
ausprogrammiert sein

Ja, aber die stammt nicht von dir. Die hat jemand anders früher geschrieben.

und die Callback-Funktion muss darin auch
an einer bestimmten Stelle aufgerufen werden, oder nicht?

Klar. Aber der ursprüngliche Programmierer kann nichts von deinem Programm wissen. Er kann da nicht hinschreiben: „rufe Daniels Daten-Sind-da-Funktion auf“. Es gibt ja noch ein hunderttausend andere Nutzer der Bib …

Was
genau hat das denn mit dem Betriebssystem zu tun, wird denn
die Callback-Funktion automatisch aufgerufen?

Das Betriebssystem ist das klassische Beispiel, weil man das (typischerweise) nicht selbst schreibt. Und weil es Dateneingänge von aussen verwaltet (Tastatur, Netzwerk,…).

cu

OK, damit ist die Sache schon klarer. D.h. in diesem Beispiel, die InformiereMich-Funktion ist z.B. in einer Bibliothek, ich rufe sie also nur auf und „weiß“ im Prinzip gar nicht, wie die Funktion genau aussieht. Ich übergebe dieser Bibliotheks-Funktion die Referenz auf meine eigene Funktion (die Callback-Funktion) und in dieser Callback-Funktion wird somit (von mir selbst) definiert, wie ich informiert werden will bzw. was eigentlich passieren soll.

Die Bibliotheksfunktion checkt also auf Netzwerkaktivitäten, meine eigene Funktion informiert mich dann.
Hab ich das jetzt so richtig verstanden?

Dankeschön, ich denke jetzt hab ich’s kapiert :smile:

Danke für die Erklärung!

Hallo Fragewurm,

Aber diese bitteInformierMich-Funktion muss ja auch
ausprogrammiert sein und die Callback-Funktion muss darin auch
an einer bestimmten Stelle aufgerufen werden, oder nicht? Was
genau hat das denn mit dem Betriebssystem zu tun, wird denn
die Callback-Funktion automatisch aufgerufen?

Eine typische Anwendung ist ein Aufruf durch einen Timer in bestimmten Intervallen.

Der Timer steckt irgendwo in der Hardware, ist je nach verwendeter Hardware unterschiedlich aufgebaut und kann von beliebig vielem Programmen gleichzeitig verwendet werden.

Logischerweise wird dieser Timer vom Betriebssystem verwendet, welches aber keinerlei Ahnung von deinem Programm hat.

Du kannst dann über einen Betriebssystem-Aufruf den Timer mit einem bestimmten Intervall starten.

Nur, was soll das Betriebssystem tun, wenn der Timer abgelaufen ist?

Richtig, beim Starten des Timers gibst du noch den Einsprungspunkt einer eigenen Funktion mit, welche dann bei jedem Ablauf des Timers vom der Timerverwaltung aufgerufen wird.

MfG Peter(TOO)

Hallo,
Hauptaussage: du rufst die Callback-Funktion nicht direkt auf, weil es entweder noch zu früh dafür ist oder dein eigenes Programm gar nicht alle Informationen hat. Einfachstes Beispiel: Javascript-Event. Das Ereignis ist noch nicht eingetreten und du weißt auch definitv nicht, welche Taste gedrückt, Button angeklickt worden ist usw. Das System, das die Funktion später aufruft, weiß das aber.
Aus der Sicht dessen, der den Aurufer der Callback-Funktion schreibt, formuliert: Wenn ich ein komplexes System entwickeln muss, dann bringt es etwas, über die eigene Implementierung gar nichts auszusagen, sondern nur: wenn ein bestimmtes Ereignis eintritt, dann rufe eine Callback-Funktion auf, die folgende Informationen bekommt: Ereignisart, Zeitpunkt, Taste, …

Grüße