Anzeige:
Ergebnis 1 bis 4 von 4

Thema: Callbacks, Signals u. Slots [auch für nicht-Qtler]

  1. #1
    Registrierter Benutzer
    Registriert seit
    17.05.2003
    Beiträge
    59

    Callbacks, Signals u. Slots [auch für nicht-Qtler]

    Wie man Callbackfunktionen alá onKeyDown() etc. oder Signals alá clicked() mit Slots verwendet ist mir durchaus klar.
    Mich beschäftigt nur immerzu die Frage, wie diese drei Funktionstypen implementiert sind.

    Callback-Funktionen:
    Ich hab das so verstanden, dass diese Funktionen (wenn ich eine Taste drücke etc.) vom Betriebssystem aufgerufen werden, nachdem dieses wie auch immer mitbekommen hat, dass ich etwas gedrückt habe.
    Das müsste doch heißen, dass z.B. bei Qt im kompilierten und gelinkten Code eine Referenz auf mein Objekt in so einer Art "Referenz-Liste" steht.
    NUR:
    Woher weiß das Betriebssystem bzw. das Programm, WELCHES Objekt gemeint ist? Gibt es von JEDEM Objekt im Programm eine Referenz in einer Programm-eigenen Liste? Es gibt doch soetwas wie eine "Programminstanz", die das Betriebssystem sieht, oder? Wird solch eine Funktion in einem Objekt direkt vom Betriebssystem aufgerufen? Oder wird über meine Programm-Instanz über alle Unterobjekte bis zu besagten Objekt vorgedrungen? Wenn ja - woher weiß das Programm / Betriebssytem, WELCHES Objekt aufgerufen werden muss?

    Signals+Slots:
    Wie kann es sein, dass ich mit einer static-Funktion wie QObject::connect() einzelne Instanzen von Objekten verbinden kann? Werden die Referenzen auf diese Objekte gespeichert? In einer statischen Instanz von QObjekt? Oder wie werden die Verbindungen sonst verwaltet?


    Ich hoffe, dass ihr ungefähr versteht, was ich wissen möchte. Es geht hier nicht darum, wie man mit diesen drei Funktionstypen programmiert, sondern wie sie implementiert sind.

    Gruß,
    euer Miles

  2. #2
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477

    Re: Callbacks, Signals u. Slots [auch für nicht-Qtler]

    Original geschrieben von Miles
    Wie man Callbackfunktionen alá onKeyDown() etc. oder Signals alá clicked() mit Slots verwendet ist mir durchaus klar.
    Mich beschäftigt nur immerzu die Frage, wie diese drei Funktionstypen implementiert sind.
    Drei?


    Callback-Funktionen:
    Ich hab das so verstanden, dass diese Funktionen (wenn ich eine Taste drücke etc.) vom Betriebssystem aufgerufen werden, nachdem dieses wie auch immer mitbekommen hat, dass ich etwas gedrückt habe.
    Das Betriebsystem hat damit eigentlich nix zu tun.
    Für das Betriebsystem gibt es nur Prozesse, denen Resourcen (zB: Rechenzeit) zugeteilt werden.


    Woher weiß das Betriebssystem bzw. das Programm, WELCHES Objekt gemeint ist?
    Wenn ein Programm ein Fenster öffnet will, fragt es das Windowing System nach einem neuen Fenster.
    Das erzeugt dann unter anderem einen Identifiaktor und teilt diesem der Applikation mit.
    Wenn du zB auf ein Fenster klickst, generiert das Windowing System ein Event für dieses Fenster.
    Je nachdem wie das Eventubehandlungsmodell der Applikation aussieht, wird dieses Event zB in der Eventschleife des Programms behandlet.
    Da im Event der Indetifikator des Fenster steht, kann dieses innerhalb des Fensterbaums der Applikation gefunden werden und die entsprechende Methode aufgerufen werden.

    Es gibt doch soetwas wie eine "Programminstanz", die das Betriebssystem sieht, oder?
    Ja, ein Prozesseintrag.


    Wird solch eine Funktion in einem Objekt direkt vom Betriebssystem aufgerufen?
    Nein, das Betriebsystem ruft niemals Funktionen eines Prozesses auf.
    D.h. keine so allgemeinen, ein Programm kann für spezielle Sachen Funktionen bekannt geben, Signalhandler zum Beispiel.


    Signals+Slots:
    Wie kann es sein, dass ich mit einer static-Funktion wie QObject::connect() einzelne Instanzen von Objekten verbinden kann? Werden die Referenzen auf diese Objekte gespeichert? In einer statischen Instanz von QObjekt? Oder wie werden die Verbindungen sonst verwaltet?
    Könnte sein, dass die Verbindungen in einer statischen Tabelle gespeichert werden, könnte aber auch sein, dass sie in den beiden Objekten gespeichert wird, oder im Sender Objekt.

    Ich tippe auf das mittlere.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

  3. #3
    Registrierter Benutzer
    Registriert seit
    17.05.2003
    Beiträge
    59
    Wenn ein Programm ein Fenster öffnen will, fragt es das Windowing System nach einem neuen Fenster.
    Das erzeugt dann unter anderem einen Identifiaktor und teilt diesem der Applikation mit.
    Meinst du mit Fenster nur normale Fenster, oder gilt das auch für Elemente innerhalb eines Fensters (so wie Buttons, Edit-Felder, etc.)? Sollte doch eigentlich das Selbe sein, oder?


    Da im Event der Indetifikator des Fenster steht, kann dieses innerhalb des Fensterbaums der Applikation
    gefunden werden und die entsprechende Methode aufgerufen werden.
    Für Qt:
    Heißt dass, dass z.B. bei Qt, wenn ich die Anweisung
    Code:
    return myApp.exec();
    ausführe, innerhalb dieser Funktion der Rest des Programms abläuft (mit Event-Schleife etc.)?
    Wird dann die Message vom Betriebssystem abgefangen und dann über das Main-Widget über andere Elemente bis hin zum gesuchten Objekt (z.B. einem Button) weitergeleitet? Welche Funktionen sind dann dafür verantwortlich?
    Oder wird die Message dann DIREKT zum gesuchten Objekt geleitet? Wenn ja: Wie wird das realisiert?

    Würde mich echt interessieren. Hoffe auf baldige Antwort.
    Gruß,
    Miles


    P.S.: Woher weißt du das? Lernt man soetwas auf Seminaren, Schule, Uni, Büchern oder sonst was?

  4. #4
    Administrator Avatar von anda_skoa
    Registriert seit
    17.11.2001
    Ort
    Graz, Österreich
    Beiträge
    5.477
    Original geschrieben von Miles
    Meinst du mit Fenster nur normale Fenster, oder gilt das auch für Elemente innerhalb eines Fensters (so wie Buttons, Edit-Felder, etc.)? Sollte doch eigentlich das Selbe sein, oder?
    Ja, jedes Widget ist ein Fenster, d.h. unter X11 hat jedes Widget eine WindowID



    Für Qt:
    Heißt dass, dass z.B. bei Qt, wenn ich die Anweisung
    Code:
    return myApp.exec();
    ausführe, innerhalb dieser Funktion der Rest des Programms abläuft (mit Event-Schleife etc.)?
    Ja, korrekt.
    QApplication::exec() startet die Eventloop. Ohne exec() keine Events (GUI, Timer, Socket, etc)


    Wird dann die Message vom Betriebssystem abgefangen und dann über das Main-Widget über andere Elemente bis hin zum gesuchten Objekt (z.B. einem Button) weitergeleitet?
    Wie gesagt ist das Betriebsystem bei GUI nicht involviert, aber ich schätze es läuft so ab.
    Zumindest bei Qt werden Events des Windowing Systems in Qt Events übersetzt und werden dann über die Eventloop verteilt.
    Soweit ich weiß gehen Events von dort direkt an das Objekt, für das sie bestimmt sind.


    Welche Funktionen sind dann dafür verantwortlich?
    Bei Qt in der Klasse QEventLoop. Was genau gemacht wird, entzieht sich meiner Kenntnis.


    Oder wird die Message dann DIREKT zum gesuchten Objekt geleitet? Wenn ja: Wie wird das realisiert?
    Wahrscheinlich sind alle QObjects in einer Art Wörterbuch eingetragen, oder zumindest die, welche keinen Parent haben.
    Könnte man bei Bedarf sicher im QObject Source nachlesen.


    P.S.: Woher weißt du das? Lernt man soetwas auf Seminaren, Schule, Uni, Büchern oder sonst was?
    Gute Frage, ich schätze teils/teils.
    Man kann auch viel aus der Struktur von Eventbehandlungssystemen extrahieren, wie sie dem Programmierer gegenüber erscheint.
    Zum Beispiel ist es in Qt eben möglich, alle Events der Applikation durch einen Eventfilter am QApplication Objekt zu "sehen", daraus lässt sich schliessen, dass alle Events durch eine zentrale Stelle laufen und dann verteilt werden.

    Ciao,
    _
    Qt/KDE Entwickler
    Debian Benutzer

Lesezeichen

Berechtigungen

  • Neue Themen erstellen: Nein
  • Themen beantworten: Nein
  • Anhänge hochladen: Nein
  • Beiträge bearbeiten: Nein
  •