Autor Thema: GUI: Technische umsetzung  (Gelesen 29815 mal)

Golum

  • Beiträge: 96
    • Profil anzeigen
Gespeichert
« am: 19. May 2005, 15:43 »
Ich habe mir mal einige wenige Gedanken zur GUI gemacht.

Die GUI zeichnet über einen "Grafik-Server" auf den Bildschirm.

Wenn der Kernel eine Eingabe erhält die auf die GUI einwirkt (Tastendrücke etc. ) fügt er die einer Message-Queue zu, von Zeit zu Zeit arbeitet die GUI die ersten x einträge ab. Falls die Queue voll ist werden einfach keine weiteren eingaben akzeptiert.

Die GUI wird als Anwendung laufen (vergleichbar mit X unter Linux).


Was vielleicht noch zu ändern wäre ist das die GUI eingaben direkt abfragt aber dann müsste sie als Kernel-modul laufen.

Vorschläge sind natürlich gerne gesehen  :D

DDR-RAM

  • Beiträge: 184
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 19. May 2005, 15:49 »
Zitat von: Golum
Was vielleicht noch zu ändern wäre ist das die GUI eingaben direkt abfragt aber dann müsste sie als Kernel-modul laufen.


Ich persönlich nehme sowieso immer weiter Abstand von einem echten Microkernel. Aber ich steh recht alleine da :-(

T-Head

  • Beiträge: 157
    • Profil anzeigen
    • http://www.t-head.de.vu/
Gespeichert
« Antwort #2 am: 19. May 2005, 17:23 »
Hi,

mir gefällt diese Idee! Hört sich zumlich guit an!


Zitat von: Golum
Falls die Queue voll ist werden einfach keine weiteren eingaben akzeptiert.


Nur das find ich nicht so gut! Wie viele Einträge soll es da dann geben können? Wenn, dann müssten des schon so viele sein, das sie bei normalem gebracuch nicht vill werden kann, sonst will man ein Fenster verschieben, da dieser eintag abe nicht mehr rein geht, kann man das net machen, ...



Zitat von: Golum
von Zeit zu Zeit arbeitet die GUI die ersten x einträge ab


Was meinst du mit von Zeit zu Zeit?? Dess sollte schon zügig ablaufen!



Und zu letzt noch eine kleine Frage:

Hat jedes offene Fenster seine eigene Message-Queue oder gibt es eine für alle Fenster zusammen?

sov21

  • Beiträge: 53
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 19. May 2005, 17:31 »
ich persönlich würde die GUI als seperates Prog einrichten, das man aufrufen kann. So wie es bei Linux ist, oder bei Win3.11 war.
Hätte den Vorteil, daß der Kernel nicht weiter beladen wird, und fehler nicht den kernel stören, bzw. auch die Entwicklung der GUI seperiert werden kann.
Ist aber "nur" meine Meinung.

P.S.: Wäre sowieso toll, wenn der Kernel möglichst schnell ein funktionierendes Dateisys unterstützt, und dann um Funktionalität mittels Dateien eerweitert werden kann. (Weiß allerdings nicht wie viel Arbeit das alles ist. Bin noch immer Anfänger :-( )
Gruß sov21

The-Programmerfish

  • Beiträge: 434
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 19. May 2005, 18:32 »
Zitat von: T-Head
Zitat von: Golum
Falls die Queue voll ist werden einfach keine weiteren eingaben akzeptiert.



Nur das find ich nicht so gut! Wie viele Einträge soll es da dann geben können? Wenn, dann müssten des schon so viele sein, das sie bei normalem gebracuch nicht vill werden kann, sonst will man ein Fenster verschieben, da dieser eintag abe nicht mehr rein geht, kann man das net machen, ...


Vielleicht hat irgendein böses Progrämmchen ne Endlosschleife die die Queue immer weiter auffüllt. Das System würde überlastet werden. Das ist schon gut so wie Golum das machen will ^^
Zitat von: t-head

Zitat von: Golum
von Zeit zu Zeit arbeitet die GUI die ersten x einträge ab


Was meinst du mit von Zeit zu Zeit?? Dess sollte schon zügig ablaufen!


1. Hat die GUI auch noch andere Sachen zu machen
2. Gibts mehrere Anwendungen die abgearbeitet werden sollen
3. Siehe oben
<- Verhasst, Verdammt, Vergöttert

Golum

  • Beiträge: 96
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 19. May 2005, 18:42 »
Das Problem das du bei normaler verwendung keine eingaben mehr machen kannst wirst du sicher nicht haben  :D

Von Zeit zu Zeit wird wahrscheinlich sehr sehr oft sein (Nach jedem Abarbeiten der anfallenden aufgaben)

Zitat
Hat jedes offene Fenster seine eigene Message-Queue oder gibt es eine für alle Fenster zusammen?

Beides :D Eine Queue für die GUI und die Eingaben/Nachrichten werden dann weiter an die Anwendungen verteilt.

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #6 am: 19. May 2005, 19:14 »
Wie soll eine Anwenung für die GUI aussehen? Soll das so laufen wie bei Windows mit ner CreateWindow() Funktion? Und wenn man schon bei Messages sind: Wird die Queue für ein bestimmtes Fenster von einer Callback-Funktion wie bei Windows abgearbeitet oder wird es eine ähnliche/andere Lösung dafür geben.[/code]

Golum

  • Beiträge: 96
    • Profil anzeigen
Gespeichert
« Antwort #7 am: 19. May 2005, 19:23 »
Ich denke es wird so eine Art CreateWindows Funktion geben.

Die Callback-Funktion von Windows muss das Programm ja auch selber aufrufen daher denke ich werden wir es so machen das man die Nachrichten selber abruft und verarbeitet oder an eine Standartfunktion weiterreicht.

DarkThing

  • Beiträge: 652
    • Profil anzeigen
Gespeichert
« Antwort #8 am: 19. May 2005, 19:28 »
Okay. Und wie siehts mit Control-Erstellung aus? Wird das auch über Funktionen gemacht oder wird einfach eine Datei gelesen in der die Infos stehen? Ich wär hier für beides.

@Klassen:
Ich würde eine Klasse für Elemente oder sowas machen. Die hat nur Grundlegende Methoden/Eigenschaften, z.B. Position, oder eine Neu-Zeichnen-Methode. Und von dieser Klasse kann man dann eine Fensterklasse, eine Button-Klasse, usw. ableiten. Fenster kann man wieder unterteilen in Dialogboxen, Messageboxen, normalen Fenstern, MDI-Fenster, usw. Man kann so relativ leicht z.B. ein neues Control erstellen.

Golum

  • Beiträge: 96
    • Profil anzeigen
Gespeichert
« Antwort #9 am: 19. May 2005, 19:38 »
Zitat
Ich würde eine Klasse für Elemente oder sowas machen. Die hat nur Grundlegende Methoden/Eigenschaften, z.B. Position, oder eine Neu-Zeichnen-Methode. Und von dieser Klasse kann man dann eine Fensterklasse, eine Button-Klasse, usw. ableiten. Fenster kann man wieder unterteilen in Dialogboxen, Messageboxen, normalen Fenstern, MDI-Fenster, usw. Man kann so relativ leicht z.B. ein neues Control erstellen.


Die Idee gefällt mir auch. Wie das erstellen von Controlls und das Verwalten dieser dann genau funktioniert weiß ich noch nicht aber es wird ohnehin noch etwas dauern bis wir daran arbeiten können.[/quote]

hannibal

  • Host
  • Beiträge: 400
    • Profil anzeigen
    • brainsware - the rock.
Gespeichert
« Antwort #10 am: 19. May 2005, 22:54 »
ich wuerde mich bei der API fuer die GUI auf jeden fall an .NET orientieren. klingt bloed, aber die lib ist sehr gut durchdacht und ist relativ einfach anzuwenden.

d.h. es wuerde eine haupt-basisklasse CControl geben, von der dann CWindow, CTextBox, CMenu, .. erben und ihre eigenen zeichenfunktionen und und und mitbringen.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformscontrolclasstopic.asp
[control-class]
http://msdn.microsoft.com/library/default.asp?url=/library/en-us/cpref/html/frlrfsystemwindowsformsformclasstopic.asp
[windows-form(also fensterl)-class]

lg, hannibal
\\o
o//
\o/

The-Programmerfish

  • Beiträge: 434
    • Profil anzeigen
Gespeichert
« Antwort #11 am: 19. May 2005, 22:58 »
.NET ist BÖSE ^^

Ich hab eine furchtbare Microsoft Phobie ^^

Egal ich finde wir sollten schon was mehr oder weniger eigenes machen.
<- Verhasst, Verdammt, Vergöttert

hannibal

  • Host
  • Beiträge: 400
    • Profil anzeigen
    • brainsware - the rock.
Gespeichert
« Antwort #12 am: 19. May 2005, 23:08 »
natuerlich was eigenes, aber das prinzip, dass da dahintersteckt ist sehr sehr gut durchdacht und vereinfacht einem anwendungs-programmierer (auf gui-ebene) das leben um laengen! (man sehe sich bitte nur die C-WinAPI an..grausam(st)!)

lg, hannibal
\\o
o//
\o/

The-Programmerfish

  • Beiträge: 434
    • Profil anzeigen
Gespeichert
« Antwort #13 am: 19. May 2005, 23:09 »
Das kann nicht sein. .NET kann nicht von Microsoft sein. Microsoft macht sonst doch nur Scheiße.
<- Verhasst, Verdammt, Vergöttert

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #14 am: 19. May 2005, 23:10 »
Zitat von: DarkThing
Ich würde eine Klasse für Elemente oder sowas machen. Die hat nur Grundlegende Methoden/Eigenschaften, z.B. Position, oder eine Neu-Zeichnen-Methode. Und von dieser Klasse kann man dann eine Fensterklasse, eine Button-Klasse, usw. ableiten. Fenster kann man wieder unterteilen in Dialogboxen, Messageboxen, normalen Fenstern, MDI-Fenster, usw. Man kann so relativ leicht z.B. ein neues Control erstellen.

Sind diese Controls nicht eine ganz andere Ebene als grundlegende Grafikfunktionen und Eventverarbeitung usw., zumindest wenn man dem ursprünglichen Vorschlag folgen und etwas eher X-Server-mäßiges bauen will? Ich würde vorschlagen, das deutlich zu trennen, so daß das Toolkit mit den Widgets eine eigene, unabhängige Schicht ist, die auf den grundlegenden Funktionen aufsetzt.

PS: Ich hoffe, es nimmt mir niemand übel, daß ich mich gleich mit meinem ersten Post hier einmische... ;)
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

hannibal

  • Host
  • Beiträge: 400
    • Profil anzeigen
    • brainsware - the rock.
Gespeichert
« Antwort #15 am: 19. May 2005, 23:15 »
ach was :roll: ..microsoft ist kommerz; aber mit c# + .net hat man die moeglichkeit relativ einfach was feines unter windows (!) zu zaubern. sollte man was anderes wollen, kann man sich sowieso brausen gehn ^^

auf jeden fall wollte ich damit eine anregung geben, da ich (als microsoft-veraechter) wirklich der meinung bin, dass die GUI-lib in .net gut durchdacht ist.

ein weiterer vorteil gegenueber der herkoemlichen WinAPI sind die events; man braucht keine fette switch-anweisung, in der man lParam und wParam zerstueckelt um dann zu versuchen mit WM_BLAH irgendwelche events abzufangen - nein - stattdessen kann man fuer jedes event eine eigene prozedur anlegen (oder man legt keine an und verlaesst sich auf den standard-handler), um so individuell und punktgenau eingreifen kann (siehe interrupt-verwaltung; ist nichts anderes als sich in irq-leitungen einklinken)

lg, hannibal

(edit) taljeth:
die grundfunktionen muessen natuerlich vorhanden sein:
DrawPixel(), DrawLine(), DrawRectangle(), FillRectangle().. von mir aus auch DrawRadius() ..

die event-behandlung waere dann aehnlich der interrupt-behandlung auf lowlevel-ebene.
\\o
o//
\o/

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #16 am: 19. May 2005, 23:33 »
Zitat von: hannibal
die grundfunktionen muessen natuerlich vorhanden sein:
DrawPixel(), DrawLine(), DrawRectangle(), FillRectangle().. von mir aus auch DrawRadius() ..

Jepp. Ich meinte nur, weil die Diskussion hier ziemlich durcheinander geht, obwohl Widget-Satz und die grundlegende Architektur doch eigentlich zwei völlig unterschiedliche Sachen sind - im Prinzip könnte man fast sagen, zwei verschiedene Projekte.

Zitat
die event-behandlung waere dann aehnlich der interrupt-behandlung auf lowlevel-ebene.

Also auf deutsch gesagt, für die zu verarbeitenden Events registieren die Programme Callbacks bei der GUI (hm, was wäre ein passenderes Wort für diese untere Schicht?), die dann beim Auftreten eines entsprecheden Events aufgerufen werden, richtig? Halte ich für sinnvoll, jedenfalls besser als wenn jedes Programm seine eigene Event-Loop mitbringen muß.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

hannibal

  • Host
  • Beiträge: 400
    • Profil anzeigen
    • brainsware - the rock.
Gespeichert
« Antwort #17 am: 19. May 2005, 23:37 »
Zitat von: taljeth
Zitat
die event-behandlung waere dann aehnlich der interrupt-behandlung auf lowlevel-ebene.

Also auf deutsch gesagt, für die zu verarbeitenden Events registieren die Programme Callbacks bei der GUI (hm, was wäre ein passenderes Wort für diese untere Schicht?), die dann beim Auftreten eines entsprecheden Events aufgerufen werden, richtig? Halte ich für sinnvoll, jedenfalls besser als wenn jedes Programm seine eigene Event-Loop mitbringen muß.


genau das. so kann man naemlich wirklich spezifisch auf events zugreifen und man kennt sich einfach im code aus ^^
\\o
o//
\o/

mastermesh

  • Beiträge: 341
    • Profil anzeigen
    • http://www.kostenloser-laptop.de/
Gespeichert
« Antwort #18 am: 20. May 2005, 09:36 »
Longhorn / .NET / was auch immer hat doch irgendeine neue Technologie, die die Controls mit ihren Parametern in einer XML-Datei speichert... das wär doch auch ne gute Idee, oder?

Svenska

  • Beiträge: 1 792
    • Profil anzeigen
Gespeichert
« Antwort #19 am: 20. May 2005, 10:20 »
Wo hört bei euch der Kernel auf und wo fängt die GUI an?

Im Grossen und Ganzen wuerde ich es etwa so veranschlagen: Der Kernel liefert ein Treiberinterface, also im Prinzip nen paar Zeiger auf die Grafiktreiberfunktionen, welche unterstuetzt werden oder so ähnlich.
Die Aufgabe des Grafiktreibers sind grundlegend, also Grafikmodus setzen, Pixel, Linien, Dreiecke, Rechtecke, (Polygone) zeichnen, Teile verschieben, Bildschirmspeicher sichern. Halt nur die grundlegenden Sachen, welche man später mit speziellen Treibern optimieren könnte.
Auf diesen Treiber setzt dann ein Fenstermanager auf (wie unter Linux), welcher dann die Highlevelfunktionen wie Fenster zeichnen, Fensterklassen und Steuerelemente anbietet. Auf diese Funktionen greift dann die Anwendung zurueck.

Nun gibt es diverse Modelle, wie man das angehen kann.
Man kann Fenster als Fenster nehmen und Steuerelemente (wie Textfeld etc) von der Anwendung selbst machen lassen. Das hätte nur den Nachteil, dass jede Anwendung das Rad neu erfinden muesste und das OS keine xfach getesteten Funktionen zur Verfuegung stellt. Das wäre unelegant.
Man könnte auch die Steuerelemente vom OS als "Goodies" dazugeben, sei es festkompiliert oder extern nachgeladen (Bibliotheken). Benutzt muss es ja nicht werden, wer sein SuperDuperTextfeld mit Rechtschreibpruefung haben will, soll es implementieren :-)

Aber nun muss man sich ueberlegen, wie weit die Integration der Steuerelemente funktionieren soll. Wenn ein Ereignis auftritt (und es sind viele, zB MouseMove), soll das Ereignis an die Applikation, an das Fenster oder an das Steuerelement gesendet werden? Dies beeinflusst das Programmieren der Anwendung nicht unerheblich.
Sendet man es an die Anwendung, so hat diese alle grafischen Funktionen an einer Stelle, muss sich jedoch immer darum kuemmern, wer nun eigentlich das Ereignis ausgelöst hat (man kann ja den Index eines Steuerelements dazugeben, dann wird das einfacher).
Sendet man es an das Fenster, so werden die Fenster fuer den Programmierer getrennt, was Vor- und Nachteile mit sich fuehrt, da man bei gewissen Sachen halt auf ein Fenster beschränkt ist.
Schliesslich kann man das Ereignis auch direkt ans Steuerelement senden, was man als Programmierer wieder anderweitig handhaben muss.

Ich persönlich wuerde Messages an das Hauptfenster senden, denke ich. Sollte ich nen Gedankenfehler drin haben... sagt's einfach.

Nun muss man ueberlegen, wie man Fenster ueberhaupt intern darstellt. Gibt es nur "das" Fenster, oder verschiedene Typen wie z.B. Dialog etc. Diese Typen könnte man dann anpassen und damit evtl. sogar eine Optimierung erzeugen - ein Dialog muss keine Maximierenfunktion besitzen, wenn sie eh ausgeblendet wird. Man sollte auch ein grobes "nichts"-Fenster haben, womit sich die Anwendung dann komplett selbst designen kann.
Werden Steuerelemente von Fenstern abgeleitet? Was bringt das fuer Vor- und Nachteile? Vorteile sind, dass man diverse Funktionen nicht extra einbinden muss, diese demgegenueber aber auch nicht optimiert sind auf den Zweck. Die Programmierung wird einfacher. Nachteiligerweise wird das Steuerelement grösser im RAM und etwas langsamer.
Werden Steuerelemente einfach auf das Formular "projiziert" oder gezeichnet? Also, ist es vom Formular getrennt oder mit diesem verschmolzen?
Ersteres macht das dynamische Erstellen (bzw. wieder Entfernen) ziemlich einfach und schnell und verkompliziert die Programmierung; letzteres ist von der GUI einfacher zu handhaben.

Was die Ereignisverarbeitung nochmal angeht, so sollte sich ein Hauptfenster bei der Applikation "anmelden" und Ereignisse an eine gewisse Stelle im Code geliefert kriegen. Also dass man eine Prozedur erzeugt, welche dann vom Windowmanager aufgerufen wird. Auch könnte das Hauptfenster dann beim Windowmanager fuer jedes Steuerelement eine(!) Prozedur angeben. Das ist nicht unbedingt effektiv (wegen der ständigen Zerstueckelung der Parameter, welches Ereignis das nun war), aber erleichtert das Programmieren des Fenstermanagers ungemein. Man stelle sich vor, eine Anwendung schreibt drei Dutzend Funktionen fuer diverse Ereignisse und der Windowmanager ruft diese dann auf. Wäre fuer mich Schwachsinn, da ist eine Verteilerfunktion im Fenster dann schon besser.

Ich hab das jetzt mal Rueckwärts von VB gesehen. Teilweise wurde das eine oder andere sicher schon gesagt, auch habe ich vieles zwischendurch vergessen, was ich noch schreiben wollte :( und auch vieles vereinfacht dargestellt.
Ein Ziel ist zwar wichtig, aber der Weg sollte bei diesem Betriebssystem überhaupt das Ziel sein. Denn es war als LernOS geplant, nicht als Konkurrenz zu irgendetwas.

Ach ja und noch etwas in eigener Sache... es wäre schön, wenn die Grafische Oberfläche schnell und sparsam wäre (aus Sicht des Rechners), also so schnell wie möglich programmiert (nicht unbedingt hochoptimiert). Ich weiss zwar nicht, wie die Anforderungen liegen, aber ein OS mit Textverarbeitung, welches auf nem 486er in 15sec komplett geladen ist (auf nem P4 dementsprechend schneller ;) ) wuerde so ziemlich allem den Rang ablaufen, was ich hier so habe. Ein ineffizientes OS wie die neueren Windosse (wo man halt bei weniger Megahertzen bei jedem Klick ne halbe Ewigkeit warten muss) möchte ich nicht haben.

Soweit erstmal ein paar (hoffentlich gute) Anregungen, wie man die GUI designen könnte.

Svenska

 

Einloggen