Frage von Berny96, 63

Wie genau löst man im Code einen Event aus?

Ich suche eine Antwort die erklärt wie zum Beispiel bei einer Desktopanwendung nach einem Klick auf einen Button "gehört" wird. Wie sieht das im inneren des Codes aus? Was ich mir gedacht habe ist das man in einem Seperaten Thread eventuell in einer while(true) schleife dauernd nach Input vom Maus fragt und beim Klick die Position abgefragt wird und entsprechend des darunterliegenden Buttons das Event ausgelöst wird. Natürlich ist das stark vereinfacht aber funktionieren solche Techologien wie WPF oder Forms im prinzip nach dem Konzept? Achtung: Ich will nicht wissen wie man eine schon vorhandene Benutzeroberfläche verwendet sondern wie sie selber gemacht wurde. Dankeschön :)

Hilfreichste Antwort - ausgezeichnet vom Fragesteller
von phigeek, 19

In der Regel ist ein «busy»-wait (polling), also in einer Schleife permanent die Signale zu prüfen sehr unperfomant, will sagen ressourcenfressend.

Heute wird meist eine Interrupt-Routine verwendet. Sobald ein Hardwareevent (Maus, Tastatur, o. ä.) auftritt, verzweigt der Prozessor in eine Interrupt-Routine; dies wird dem Prozessor über sog. Interrupt-Leitungen (also HIGH Zustand am Kabel) mitgeteilt. Das laufende Programm wird dann unterbrochen und in die Interrupt-Routine verzweigt, welche aber sofort wieder zurückkehren muss, wenn das Event-Objekt erzeugt und weitergeleitet ist. Das Hauptprogramm soll nämlich durch die Interrupts nicht zu lange unterbrochen werden. Das erzeugte Event-Objekt für das Betriebssystem wird später dem Programmier-Framework (.NET, jvm) weitergeleitet. Bei Windows 3.1 (lange ists her) hat die Interrupt-Routine nur ein Datenobjekt (Record) erzeugt, welches in eine Event-Liste (sog. Event-Queue) gelegt wurde. Das Betriebssystem kann danach in einer Schleife jedes Event dieser Schleife bearbeiten und den entsprechenden Programmen (.NET, jvm, Office, ...) weiterleiten. Die Programme können das Event nun komplett verarbeiten oder als unverarbeitet zurücksenden, damit das Event auch weiteren Programmen zur Verfügung stehen kann. Somit ist es auch möglich, dass ein Event mehreren Programmen zur Verfügung steht: Dazu werde ich das Event verarbeiten, es aber danach dem Betriebssystem als unbearbeitet zurücksenden.

Siehe auch hier:

https://de.wikipedia.org/wiki/Interrupt

dort werden Maus und Tastatur als "Ein-/Ausgabegeräte" bezeichnet.

Kommentar von Berny96 ,

Aus Interesse, wieso hat das Betriebsystem nicht die Intelligenz das Objekt dann als "verarbeitet" wieder anzunehmen und es trotzdem an die nächsten Programme weiterzuleiten. Wieso täuschen die Programme nach dem Verarbeiten vor es sei unverarbeitet? Danke für die Super Info!! Ach und noch eine Frage: Kann ich davon ausgehen das WPF und Forms die Interupt-Routine verwenden? 

Kommentar von phigeek ,

Über WPF weiß ich als Linux user gar nix.

Zur ersten Frage: Das Betriebssystem muss in der Regel davon ausgehen, dass ein Event nach dem ersten Auftreten (z. B. Tastendruck) vom Programm (z. B. MS-Word) bereits vollständig behandelt ist; dann wird das Event aus der Queue entfernt. Das Zurückschicken als «unverarbeitet» ist die Ausnahme. Nur wenige Programme verwenden ein Event doppelt (z. B. Mouse-Move zum Linienzeichnen, aber auch zum schauen, ob die Linie einen Bereich berührt/verläßt/...).

Antwort
von JohannVanLindt, 24

Wie du schon vermutet hast gibt es beim Event-driven Programmieren eine Hauptschleife, die auf ein Event wartet wie z.B. eine Tasteneingabe, die dann eine Callback-Funktion aufruft.

Hier wird es beschrieben:

https://en.wikipedia.org/wiki/Event-driven\_programming


Kommentar von Berny96 ,

Da bin ich doch beruhigt das meine Vorstellungen der Wahrheit entsprechen. Danke!

Antwort
von Hendrik2708, 31

Ich stelle mal eine Vermutung auf:

Ich denke das mit deinem Thread  ist schon ganz richtig. Jedoch um das zu ergänzen glaube ich, dass wenn du klickst, alle Buttons/Elemente durchgegangen werden und mit buttonObjekt.getBounds() (Liefert glaube ich ein Rectangle Objekt) überprüft wird (RectangleObjekt.intersects()) ob der Punkt des Klicks auf dem Button liegt und dann halt das Event gefeuert wird :D Ist halt nur ne Vermutung :)

Kommentar von Berny96 ,

Glaubst du wirklich die Main Loop solcher API's wurde in der Sprache geschrieben mit der man sie verwendet? Also ich könnte mir nur sehr schwer vorstellen das der Code der Hinter der Technologie steckt C# ist. Was meinst du?

Kommentar von Hendrik2708 ,

Ich bin jetzt von Java ausgegangen ^^

Antwort
von Neubii, 41

einfach eine funktion mit xxxx_mouseenter oder xxxx_click

da brauchst du keine dauerhafte schleife ist wie bei den anderen objekten auch

Kommentar von Berny96 ,

Du hast die Frage ein wenig falsch verstanden aber danke für die Mühe :)

Antwort
von Tschoo, 11

Ich glaube nicht, dass Neubii die Frage falsch verstanden hat -- du hast die Antwort nicht verstanden.

Die regelmässige "Event-Abfrage" übernimmt das Betriebssystem, deshalb musst du keinen eigenen Thread dafür schreiben.

In deinem Code musst du dann nur die entsprechende Funktion (listener, z.B. MouseOver) abfragen, ob die Maus über das entsprechende Objekt gegeangen ist.

Gruß

Kommentar von Berny96 ,

Du hast die Frage ebenfalls falsch entgegengenommen :) Mein Frage ist nicht wie ich als Endnutzer solcher Event basierten Technologien verschiedene Events im Code verwende sondern eher wie die Technologien intern arbeiten und genauer wie dann im nachhinein bei der Verwendung solche Technologien die Events in das Framework kommen. phigeek hat dies sehr schön beschrieben .

Keine passende Antwort gefunden?

Fragen Sie die Community