Eine GUI wie eine Tastatur



  • Hallo,
    jeder von euch kennt wohl den Befehl zum Einlesen von Zeichen von einer Tastatur.
    cin >> [Variable]
    Die Funktionsweise ist ja wir warten auf einen Tastaturdruck solange schlafen wir bis ein Tastaturdruck tatsächlich erfolgt.
    Wir schlafen also solange bis wir ein Event bekommen indemfall ein Zeichen von der Tastatur.

    Ich möchte gerne eine GUI die sich genauso verhält wie eine Tastatur.
    Wenn ich also ein Objekt der GUI erstelle zum Beispiel so

    int main() {
    GUI gui;
    string event = gui.getEvent();
    
    if ( event == "LEFT_BUTTON" ) {
    gui.box1("Linker Button gedrückt");
    } else if ( event == "RIGHT_BUTTON" ) {
    gui.box1("Rechter Button gedrückt")
    } ...
    

    Möchte ich zum einen das die GUI erscheint. Die Methode getEvent soll solange den Main Thread blockieren bis ein Event ausgelöst wurde durch die GUI. Auch will ich Methoden haben die dann auf die GUI zugreifen wie gui.box1 was eine box darstellt in der was drin steht.

    Fakt ist ich möchte wirklich die gesamte Funktionalität und Logik auslagern die GUI soll mir nur mitteilen welche Events passieren das wars. In meinem Main findet dann die gesamte Ablauflogik statt.

    Was für eine Grafikbibliothek könnt ihr mir empfehlen ich benutz grade FLTK und da ist es fast unmöglich. Da man da kurzum das Objekt erstellt und im main quasi schreiben muss return Fl::run().

    Ein Lösungsansatz den ich hätte wäre die GUI in einen Thread auszulagern und mit globalen Variablen auf die Events zuzugreifen, aber dann habe ich das Problem wie greif ich auf die Methoden der GUI zu wenn Sie sich in einem anderen Thread befinden wahrscheinlich ein globale Zeiger würde mir da helfen.

    Wäre nett wenn ihr mir paar Tipps geben könntet und mir einen Rat geben könntet welche Grafikbibliothek für mich am geeignetesten ist dem wichtig ist Logik ganz klar von GUI zu trennen.



  • Ist diese Frage zu lächerlich ? Das man sie nicht beantwortet oder gibt es sowas garnicht so wie ich es mir vorstelle. Auch interessiert mich was ihr davon haltet ?



  • Mir ist nicht wirklich klar was du meinst und wie gut du dich auskennst. Irgendwie macht deine Frage nicht wirklich Sinn, finde ich.


  • Mod

    Wie wird ein Event ausgelöst, wenn getEvent den Thread blockiert?



  • Lass FLTK weiterhin in main laufen. Deine Ablauflogik laeuft in einem eigenen Thread. Kommuniziert wird ueber eine Messagequeue. Messages werden durch die Callbacks der einzelnen GUI-Elemente in die Queue gepackt und vom Logikthread an gewissen Punkten abgefragt. Das "Schlafen" kann standardmaessig ueber Mutex und Condition-Variable innerhalb der Messagequeue geregelt werden.



  • @phlox81 getEvent() blockiert das Main programm/den Main Thread nicht den Thread wo die GUI läuft wo sich eine Endlosschleife befindet die die Events abfängt



  • @knivil sehr gute Idee. Eine Frage wie kann ich aus dem Thread wo die Ablauflogik stattfindet eine Funktion aufrufen meines GUI Objektes welches sich im Main befindet. Spontan fällt mir jetzt ein das ich ein globalen Zeiger dafür benutze der auf das GUI Objekt referenziert.



  • Zum Beispiel die gui.box1("yxcsa")



  • Das hat knivil doch geschrieben:

    knivil schrieb:

    Kommuniziert wird ueber eine Messagequeue

    Nix Zeiger, nix direkter Zugriff!


Anmelden zum Antworten