PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : Wie funktionieren Callbacks?


Gast
2008-10-03, 12:44:07
Moin,
ich habe eine kleine Verständnisfrage zu Callbacks. Ich binde gerade eine spezielle Laborkamera in mein Programm ein. Während der Initialisierung übergibt man einen Pointer zu der Callback-Funktion die jedesmal aufgerufen wird wenn ein Frame gecaptured wird. Läuft soweit alles, ich Frage mich nur, wie der Programmablauf funktioniert.
Bei einem traditionellem Programm mit einem Thread habe ich ja meinen Message Loop der die Nachrichten von Windows verarbeitet und alles geht der Reihe nach.
Wie funktioniert jetzt aber der Callback? Sagen wir, mein Programm arbeitet grad irgendwelche Eingaben ab, hat aber sonst nicht viel zu tun. Jetzt wurde ein Frame gecaptured und die Callback Funktion wird von außerhalb aufgerufen. Nur wie? gerade eben war ich in meinem Programmablauf doch nur bei der Eingabeverarbeitung. Hält mein Programm damit jetzt einfach mal kurz an, führt meinen Callback aus und geht dann wieder zurück wohin es vorher war?

Ich bin gerade etwas verwirrt ;)

Monger
2008-10-03, 13:20:26
Hält mein Programm damit jetzt einfach mal kurz an, führt meinen Callback aus und geht dann wieder zurück wohin es vorher war?

Exakt. Ein Callback ist letztendlich auch nur ein Methodenaufruf - nur dass du eben diese Methode dynamisch übergeben bekommen hast.

Ectoplasma
2008-10-03, 15:44:35
Es gibt zwei Möglichkeiten. Beginnen wir einmal bei der Message Loop. Die Message Loop ruft bei jedem Ereignis, z.B. bei Eingaben über ein Fenster, eine Callback-Funktion auf, die zu diesem Fenster gehört. D.h., jede Fensterklasse registriert eine eigene Callback-Funktion beim OS, um Erignisse verarbeiten zu können. Dein Programm steht, solange nichts passiert, in der Funktion 'GetMessage' und wartet dort auf ein Ereignis.

Das Programm für die Laborkamera, könnte evtl. eine eigene Fensterklasse registriert haben und ein unsichtbares Fenster geöffnet haben. Wenn die Kamera einen Frame captured, dann könnte sie eine Nachricht an das unsichtbare Fenster schicken. Deine Message Loop steht jetzt nicht mehr in GetMessage, sondern ruft die Callback-Funktion des Fensters für die Laborkamera auf. Die Fenster-Callback-Funktion ruft nun die Callback-Funktion auf, die du beim Start registrieren mußtest. Der Grund warum man das auf diese Weise macht ist der, weil man so immer im selben Thread arbeiten kann und weil man nicht die Messages der Laborkamera kennen muss. Die IDs der Messages, könnten sich auch mit denen deines Programms überschneiden und das wäre schlecht ;).

Eine andere Möglichkeit wäre, dass die Laborkamera über einen eigenen Thread, deine Callbak Funktion aufruft. Das sätzt aber vorraus, das dein Programm multitasking-fähig wäre. Die Zweite Lösung schließe ich eher aus.

Gast
2008-10-04, 02:38:18
Eine andere Möglichkeit wäre, dass die Laborkamera über einen eigenen Thread, deine Callbak Funktion aufruft. Das sätzt aber vorraus, das dein Programm multitasking-fähig wäre. Die Zweite Lösung schließe ich eher aus.

Ich denke aber das ist der Fall. Der Zugriff auf die Kamera erfolgt über eine DLL, die bei der Initialisierung einen weiteren Thread startet. Mein Programm an sich ist nicht threaded.

Also ist es wirklich so, dass von außerhalb ein Sprung zu meinem Callback gemacht wird, obwohl der eigentliche Programmablauf gerade woanders ist?

Ectoplasma
2008-10-04, 14:38:58
Also ist es wirklich so, dass von außerhalb ein Sprung zu meinem Callback gemacht wird, obwohl der eigentliche Programmablauf gerade woanders ist?

Naja, was heißt das genau, wenn der eigentliche Programmablauf gerade woanders ist? Ich meine, bist du dir sicher, dass du nicht gerade in der Message-Loop hängst? Falls sich dein Programm dort befindet, könnte nämlich auch erstere von mir beschriebene Lösung in betracht kommen. Du kannst aber einen ganz einfachen Test machen. Gebe dazu einfach in deiner Callback-Funktion mit einer Message-Box, die aktuelle Thread-Id aus (mit GetCurrentThreadId). Das gleiche machst du irgendwo an andere Stelle in deinem Programm, damit du beide IDs vergleichen kannst. Oder schau einfach mit dem Debugger nach. Sind beide IDs identisch, kommt Lösung 1 in betracht. Sind sie unterschiedlich, wird wohl Lösung 2 verwendet.

Fruli-Tier
2008-10-05, 11:52:36
Die Callback wird für den Thread ausgeführt, der sie aufruft. Es ist ja nicht mehr als eine Funktion. Ein Funktion in der Du bestimmen kannst, was mit den Daten von der Kamera geschieht. Wenn die Kamera in Thread A arbeitet und dein Program im Thread B, dann ruft die Kamera die Callback im Kontext von A auf.