PureBasic Statusleiste- und Textgadget unter Linux

  • Für mein erstes PureBasic-Linux Projekt probiere ich die dafür benötigten Funktionen, um nach & nach ein Gefühl dafür zu kriegen, bevor ich dann das eigentliche Hauptprogramm beginne.
    Jetzt bin ich auf Schwierigkeiten mit der Verwendung der Statusleiste und Progressbar gestossen und versteh einfach nicht das Problem.


    Die Statusbar lässt sich in einer Schleife einfach nicht aktualisieren. Das gleiche mit dem TextGadged. Um einen ProgrammLogik-Fehler auszuschliessen, hab ich das mal parallel auf Win7 ausgeführt - da löppelt es so, wie erwartet.
    Habe dafür mal zur Demo den Testcode aufbereitet, der das Problem demonstriert. Vllt. fehlt mir für Linux ja nur irgendeine Lib oder eine Einstellung in der IDE - keine Ahnung.
    Getestet mit:
    PureBasic 5.62 auf Mint 17.3 xfce x64
    PureBasic 5.70 auf Mint 18.3 xfce, 18.1-3 Mate (alles x64)


    Wär für einen Denkanstoss dankbar...

    Gruß Jörg


    Ideen gibt es viele - man muß sie nur haben...
    Win7-Pro / Linux Mint

  • Anzeigen am Bildschirm werden nur nach einem Ereignis generiert. Die Anzeigen unter Windows nach einem Delay sind mehr zufällig :D
    D.H., Du musst alle Ereignisse in ein EventLoop auslagern und mit Timern arbeiten. Man kann sich auch behelfen, in dem man:


    Code
    While WindowEvent() : Delay 1: Wend


    einfügt, aber das ist dann keine Ereignisorientierte Programmierung ;)


    Also ab Zeile 13 gehört alles in einem EventLoop!

  • du meinst aber jetzt nicht die opligatorische Ereignisschleife, in der ich Klicks, Tasten etc. abfrage und dementsprechende Prozeduren aufrufe?
    Ich muß also gewissermaßen für Anzeigenänderungen (die ja von diversen Prozeduren ausgelöst werden können) ein Ereignis auslösen?


    Ich kann mir das grad nicht vorstellen - wenn ich aus irgendeiner Prozedur (die grad schwer beschäftigt ist) einen Textstatus ändern oder eine Progressbar anzeigen möchte, muß ich in dieser Prozedur eine Ereignisschleife packen und darin per Timeout die Anzeige aktualisieren?

    Gruß Jörg


    Ideen gibt es viele - man muß sie nur haben...
    Win7-Pro / Linux Mint

  • du meinst aber jetzt nicht die opligatorische Ereignisschleife, in der ich Klicks, Tasten etc. abfrage und dementsprechende Prozeduren aufrufe?

    Doch, genau die meine Ich!
    Ein Delay hält das Programm an (sleep) und bereinigt kein EventLoop. Alle Anzeige-Elemente werden erst nach der Ereignisabarbeitung angezeigt.


    Ich kann mir das grad nicht vorstellen - wenn ich aus irgendeiner Prozedur (die grad schwer beschäftigt ist) einen Textstatus ändern oder eine Progressbar anzeigen möchte, muß ich in dieser Prozedur eine Ereignisschleife packen

    Es ist immer besser mit nur einer Ereignisschleife zu arbeiten und keinen Code ohne Ereignis (zur Not generiert man ein eigenes Ereignis, zum B. einen Timer).
    Du kannst natürlich auch mit z.B. "BindGadgetEvent()" oder ähnlichem Arbeiten. Einfach mal die Hilfe studieren. Mit PostEvent() kann man auch Events-Generieren, z.B. aus Threads (von denen ich erstmal anfangs abrate).


    Ist nicht wie bei XProfan, wo dann alles automatisch gezeichnet/erstellt wird, wenn man will. Bei PB wird da schon ein bissel mehr vom Programmierer erwartet, dafür leistet es ja auch mehr und ist auch kompatibler zu anderen Sprachen, die auch so "kompliziert" sind. Es kommt einem nur Anfangs etwas kompliziert vor, aber wenn man die Zusammenhänge verstanden hat, geht es auch vollautomatisch richtig.

  • ok Danke,
    das Kapitel WindowEvent() / WaitWindowEvent() schau ich mir grad näher an ;)


    Die Beispiele beziehen sich dort aber nur auf dem Code innerhalb der Ereignisschleife - das geht ja klar.



    Wenn ich jedoch in eine Prozedur springe, verlasse ich ja diese Ereignisschleife, was also bedeutet, dass die Ereignisbehandlung erst nach dem Prozedur-Return wieder stattfindet. Aber alles, was während der Prozedur angezeigt werden sollte, wird verschluckt - es wird lediglich die letzte Schreib- bzw. Darstellungsaktion angezeigt.


    Oder tickt PB da anders - das ist jetzt nähmlich grad das Brett vorm Kopf, mit dem ich zu kämpfen hab.



    Werde aber jetzt mit deinen Infos und der Hilfe bissl experimentieren - mal schaun...

    Gruß Jörg


    Ideen gibt es viele - man muß sie nur haben...
    Win7-Pro / Linux Mint

  • Die meisten Ereignisse dauern ja nur ein paar millisekunden (nicht wie bei XProfan :D ) und für andere Sachen muss man eine andere Lösung finden, z.B. Code nur Stückweise ausführen, Callbacks nutzen (EventGadget() usw.), Code in Threads auslagern.


    Wirste schon raffen ;) , muß erstmal DrWho schauen :D

  • Hier noch ein kurzes Beispiel:

  • Ah - Danke. Super Beispiel, läuft gut. Werde das in meinen Entwurf integrieren.
    Ich bastel später weiter - erstmal Kopf ausruhen.
    Meld mich dann...

    Gruß Jörg


    Ideen gibt es viele - man muß sie nur haben...
    Win7-Pro / Linux Mint

  • so, hat ne Weile gedauert. Aber bin schon paar Schritte weiter.
    Die Progressbar und Statusbar läuft jetzt beim befüllen eines ListIconGadged artig mit.
    Ist aber manchmal wirklich bissl Tricki.
    Damit sich die Hauptereignisschleife nicht allzu sehr mit Code aufbläht, bau ich bei umfangreichen Code(der irgendwelche Fensteraktualisierungen enthält) in der entsprechenden Prozedur basierend auf deinem Beispiel eine timergesteuerte Ereignisschleife und entferne den Timer, bevor ich wieder zurück in die Hauptschleife hüpfe.


    Interessant ist jedoch, daß beim auswerten von #PB_Event_CloseWindow trotz Eventloop keine Fensteraktualisierung ausgeführt wird.
    Fällt mir schwer zu glauben, daß das wirklich so gewollt ist.
    Hab das mal in deinem Beispiel eingebaut (gleich der erste Case-Zweig - Fenster schließen)

    Gruß Jörg


    Ideen gibt es viele - man muß sie nur haben...
    Win7-Pro / Linux Mint

  • Immer noch nicht ganz richtig gedacht ;)
    Delay ist ein sehr schlechter Programmierstil und gehört auf jeden Fall nicht in ein EventLoop (es wird die gesamte Messagebearbeitung vom OS blockiert!)


    Hinter #PB_Event_CloseWindow wird am Ende das Fenster nur noch geschlossen, es werden also keine weiteren Ereignisse bearbeitet, auch ein Neuzeichnen nicht.

    Fällt mir schwer zu glauben, daß das wirklich so gewollt ist.

    Ist natürlich so gewollt und das einzig logische Handeln vom OS :D
    Damit man noch was sieht, sollte man den Code abändern, z.B. durch einen weiteren Timer und bloß kein Delay. Nicht das die Messagebearbeitung in der #PB_Event_CloseWindow stecken bleibt, es sollen doch weitere Ereignisse verarbeitet werden und die werden ja nur bei erneutem Erreichen von WaitWindowEvent() oder ähnlichem erreicht und nicht irgendwo mittendrin :D (deswegen ja auch EventLoop ;) )



    Guck Dir auch mal die Bind... Funktionen an, da haste dann callbacks, die in Echtzeit funktionieren. Kann man auch mixen :top:

  • ok, das mir dem Delay ist mir jetzt klar (das hält ja gewissermaßen einfach den Thread an). Habe ich im Beispiel jetzt nur reingesetzt, um zu sehen, ob das Fenster den neuen Text anzeigt. Aber das ist bis jetzt mein Denkfehler gewesen. Delay ist als "Zeitlupenfunktion" zum besseren beobachten beim entwickeln nicht das richtige Werkzeug ;)


    Anstelle von delay würden/könnten ja z.B. diverse abschliessende Aktionen stattfinden und die Anzeige soll dann nur einen Hinweis darauf geben, daß das Programm noch etwas tut und nicht etwa hängt etc.


    Bin grad am Lesen + Testen der Bind- und Callbackfunktionen. Da muß ich mich erstmal reinfummeln... :)

    Gruß Jörg


    Ideen gibt es viele - man muß sie nur haben...
    Win7-Pro / Linux Mint

Jetzt mitmachen!

Sie haben noch kein Benutzerkonto auf unserer Seite? Registrieren Sie sich kostenlos und nehmen Sie an unserer Community teil!