CALLBACK Funktion
-
Hallo,
ich verstehe irgendwie nicht ganz wozu CALLBACK Funktionen gut sind.
Habe versucht das Prinzip zu verstehen, jedoch funktioniert es nicht so wie ich es verstanden habe
Den nachdem was ich alles gelesen habe sollte eine CALLBACK Funktion ähnlich zu
einem neue Thread sein den ich quasi mit dem Funktionsaufruf starte...um dies zu testen habe ich ein einfaches Programm geschrieben wo ich in der Main
eine CALLBACK funktion aufrufe.
Nach dem ausführen des Programmes habe ich dann eigentlich erwartet das die Programme nach dem aufruf der Funktion dann quasi parallel laufen, jedoch war dies
nicht der fall....Könnte mir vll jemand den Sinn des CALLBACKS erklären ...
(Habe nämlich ein programm gefunden wo dies benutzt wird es aber keine unterschied macht ob ich eine funktion mittels CALLBACK erstelle oder nicht ( auf dem aktuellen stand zumindest ^^ ) )
-
Callback heißt übersetzt Rückruf.
Und genau das macht man mit einem Callback: Du rufst irgendwas auf und übergibst dabei ein Callback, damit dieses "irgendwas" Dich später zurückrufen kann. Beispielsweise in dem Sinne "Schicke jetzt diese Daten übers Netzwerk, dann rufe Funktion Send_Complete auf, wenn Du fertig bist". Mit Parallelität hat das erstmal garnichts zu tun.
Richtig ist wohl, dass Threads oft mit Callbacks realisiert werden. Hier rufst Du dann eine Funktion "Starte einen neuen Thread und kehre zurück, führe dabei im Hintergrund Thread_Callback aus".
-
Dann ist dieses CALLBACK wie so eine Art Pointer der der CALLBACK Funktion sagt
wo ich meine "Antwort"(oder das Ergebnis) zurückschicken muss.
Oder ist es mehr für die Aufrufende Funktion, damit Sie weis: Ja ich starte jetzt mal eine CALLBACK Funktion, die macht irgendwas aber das Ergebnis benutze ich irgendwann später.
( Das macht ja dann eigentlich, für mich ^^, nur Sinn wenn man diese CALLBACK Funktion als Thread startet).
-
Der Callback ist einfach nur eine Möglichkeit der Bibliothek, um zurückgreifen zu können auf die Daten deines Programms (was die Bibliothek dort erwartet, ist ihre Sache, wie du die Daten besorgst, ist egal). Das muß nicht immer mit Threads zu tun haben.
Zum Beispiel könntest du eine Stream-Klasse entwickeln, die beim Erzeugen eine 'int getval();' übergeben bekommt und bei jedem Leseversuch diese Funktion aufruft, um ein Zeichen zu erhalten (die C++ IO-Streams kapseln diese Funktion in ihrem Stream-Buffer). Auch die signal() und atexit() oder die C++ Funktor-Adapter Funktionen von C sind letztlich ein Callback-Mechanismus.
-
killerbiene schrieb:
Dann ist dieses CALLBACK wie so eine Art Pointer der der CALLBACK Funktion sagt wo ich meine "Antwort"(oder das Ergebnis) zurückschicken muss...
Eine Callbackfunktion ist im ersten Moment ein Verweis auf eine Funktion (z.B. Funktions- oder Methodenzeiger), die unter bestimmten Bedingungen aufgerufen wird.
Nehmen wir einfach einmal an du möchtest eine Liste sortieren, verwendest aber eine spezielle Sortierung. Nun könnte man die Sortierung so implementieren das man der Sortierung einen Callback für einen Datenvergleich mitgibt (so z.B. in der STL gemacht). Sprich du hast eine Funktion die 2 Elemente miteinander vergleicht und übergibst diese der Sortierungsfunktion. Die Sortierfunktion wiederum wird dieses Callback mehrfach für verschiedene Elemente aufrufen, bis die Sortierung abgeschlossen ist.
Es ist also kein Pointer für eine Antwort (dann könnte man auch mit Rückgabewerten arbeiten) sondern ein Mittel eine Logik generisch halten zu können (Beim nächsten Aufruf der Sortierung könntest du der Sortierfunktion eine andere Funktion zum Vergleichen mitgeben).
cu André
-
Hollywood-Prinzip: "don't call us, we'll call you" (zu deutsch: „Rufen Sie nicht uns an, wir rufen Sie an“)
Hört man zwar meistens im Zusammenhang mit OO und Frameworks, aber gilt auch für procedurale Callbacks. Es geht letztendlich darum, den Controllfluss nach draussen abzugeben. D.h. ich kann sagen, das jemand anderes z.B. eine meiner eigenen Funktionen aufrufen soll. Denn ohne Callbacks, würde nur ich meine eigenen Funktionen/Methoden aufrufen können. Ich will aber manchmal auch, das eine fremde Library auf meine Funktionen zugreifen können soll. Mehr steckt hinter einem Callback nicht.
Wie dieser Callback technisch gelöst wird, ist erstmal irrelevant. Das kann von Sprache zu Sprache unterschiedlich sein. In C++ kann das sogar von Library zu Library variieren.