PureBasic Statusleiste- und Textgadget unter Linux

    Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

    Unsere Datenschutzerklärung wurde aktualisiert. Mit der Nutzung unseres Forums akzeptierst Du unsere Datenschutzerklärung. Du bestätigst zudem, dass Du mindestens 16 Jahre alt bist.

    • 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...

      Quellcode

      1. ;test für statuszeile & textgadget PureBasic 5.70 (gtk2 / Mint 18.1-3 x64)
      2. If OpenWindow(0, 0, 0, 510, 100, "StatusBarProgress-Test", #PB_Window_SystemMenu | #PB_Window_ScreenCentered | #PB_Window_SizeGadget)
      3. Define.i a,b,c ;integer
      4. If CreateStatusBar(0, WindowID(0))
      5. AddStatusBarField(100)
      6. AddStatusBarField(400)
      7. EndIf
      8. TextGadget(1, 200, 30, 250, 20, "Statusbar und Text Demo") ;textgadget erzeugen
      9. c = 3
      10. For a = c To 1 Step -1 ;coundown soll das setzen des textgadges demonstrieren
      11. SetGadgetText(1, "Demo-Aktion startet in " + Str(a) + " Sekunden") : Debug a ;<---keine textanzeige
      12. Delay(1000)
      13. Next a
      14. SetGadgetText(1,"-START-") : Debug "-Start-" ;<---keine textanzeige
      15. For a = 1 To 100 ;schleife, die irgendwas abarbeitet incl. status- & fortschrittanzeige
      16. ;Aktion simulieren:
      17. For b = 1 To 1000000 ;geschwindigkeit kann hier angepasst werden (abhängig vom subsystem und debugger))
      18. c = b
      19. Next b
      20. ;Kontrollanzeigen für die Hauptschleife:
      21. StatusBarText(0, 0, "Loop " + Str(a)) : Debug "Loop " + Str(a) ;<---keine textanzeige
      22. StatusBarProgress(0,1,a) ;<---keine fortschrittsanzeige
      23. SetGadgetText(1, "Loop " + Str(a)) ;<---keine textanzeige
      24. Next a
      25. Repeat
      26. Until WaitWindowEvent() = #PB_Event_CloseWindow
      27. StatusBarText(0,0,"ENDE") : Debug "ENDE gedrückt" ;<---keine textanzeige
      28. StatusBarText(0,1,"Auch hier keine Anzeige") ;<---keine textanzeige
      29. Delay(3000)
      30. Debug "Aus"
      31. EndIf
      Alles anzeigen
      Gruß Jörg

      Ideen gibt es viele - man muß sie nur haben...
      XProfan X2.1, X3.1, X4.1 - XP-Pro SP2/3 & W7-Pro 64 - Mint Mate, AntiX
    • 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:

      Quellcode

      1. While WindowEvent() : Delay 1: Wend

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

      Also ab Zeile 13 gehört alles in einem EventLoop!
      Gruß Thomas
      „Wenn es mehrere Möglichkeiten gibt, eine Aufgabe zu erledigen, und eine
      davon in einer Katastrophe endet oder sonstwie unerwünschte
      Konsequenzen nach sich zieht, dann wird es jemand genau so machen.“ Murphys Gesetz
      ComputerInfo für PPF
    • 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...
      XProfan X2.1, X3.1, X4.1 - XP-Pro SP2/3 & W7-Pro 64 - Mint Mate, AntiX
    • JörgG schrieb:

      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.

      JörgG schrieb:

      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.
      Gruß Thomas
      „Wenn es mehrere Möglichkeiten gibt, eine Aufgabe zu erledigen, und eine
      davon in einer Katastrophe endet oder sonstwie unerwünschte
      Konsequenzen nach sich zieht, dann wird es jemand genau so machen.“ Murphys Gesetz
      ComputerInfo für PPF
    • 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...
      XProfan X2.1, X3.1, X4.1 - XP-Pro SP2/3 & W7-Pro 64 - Mint Mate, AntiX
    • 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
      Gruß Thomas
      „Wenn es mehrere Möglichkeiten gibt, eine Aufgabe zu erledigen, und eine
      davon in einer Katastrophe endet oder sonstwie unerwünschte
      Konsequenzen nach sich zieht, dann wird es jemand genau so machen.“ Murphys Gesetz
      ComputerInfo für PPF
    • Hier noch ein kurzes Beispiel:

      Quellcode

      1. EnableExplicit
      2. OpenWindow(0, 100, 100, 400, 200, "bla")
      3. If CreateStatusBar(0, WindowID(0))
      4. AddStatusBarField(80)
      5. AddStatusBarField(#PB_Ignore)
      6. EndIf
      7. AddWindowTimer(0, 1, 300)
      8. Define status = 1
      9. Repeat
      10. Select WaitWindowEvent()
      11. Case #PB_Event_CloseWindow
      12. Break
      13. Case #PB_Event_Timer
      14. Select EventTimer()
      15. Case 1
      16. status + 1
      17. If status > 100
      18. status = 1
      19. EndIf
      20. StatusBarText(0, 0, "Wert: " + Str(status))
      21. StatusBarProgress(0, 1, status)
      22. EndSelect
      23. EndSelect
      24. ForEver
      Alles anzeigen
      Gruß Thomas
      „Wenn es mehrere Möglichkeiten gibt, eine Aufgabe zu erledigen, und eine
      davon in einer Katastrophe endet oder sonstwie unerwünschte
      Konsequenzen nach sich zieht, dann wird es jemand genau so machen.“ Murphys Gesetz
      ComputerInfo für PPF
    • 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...
      XProfan X2.1, X3.1, X4.1 - XP-Pro SP2/3 & W7-Pro 64 - Mint Mate, AntiX
    • 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)

      Quellcode

      1. EnableExplicit
      2. OpenWindow(0, 100, 100, 400, 200, "bla")
      3. If CreateStatusBar(0, WindowID(0))
      4. AddStatusBarField(80)
      5. AddStatusBarField(#PB_Ignore)
      6. EndIf
      7. AddWindowTimer(0, 1, 50)
      8. Define status = 1,a
      9. Repeat
      10. Select WaitWindowEvent()
      11. Case #PB_Event_CloseWindow
      12. StatusBarText(0, 0, "Aus die Maus")
      13. StatusBarText(0, 1, "Moment - es wird aufgeräumt...")
      14. TextGadget(0, 0, 0, 0, 0, "") ;dummy-gadged, damit die beiden statuswerte angezeigt werden - ohne diesen passiert sonst nix
      15. Delay(2000)
      16. Break
      17. Case #PB_Event_Timer
      18. Select EventTimer()
      19. Case 1
      20. status + 1
      21. If status > 100
      22. status = 1
      23. EndIf
      24. StatusBarText(0, 0, "Wert: " + Str(status))
      25. StatusBarProgress(0, 1, status)
      26. EndSelect
      27. EndSelect
      28. ForEver
      Alles anzeigen
      Gruß Jörg

      Ideen gibt es viele - man muß sie nur haben...
      XProfan X2.1, X3.1, X4.1 - XP-Pro SP2/3 & W7-Pro 64 - Mint Mate, AntiX
    • 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.

      JörgG schrieb:

      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:
      Gruß Thomas
      „Wenn es mehrere Möglichkeiten gibt, eine Aufgabe zu erledigen, und eine
      davon in einer Katastrophe endet oder sonstwie unerwünschte
      Konsequenzen nach sich zieht, dann wird es jemand genau so machen.“ Murphys Gesetz
      ComputerInfo für PPF
    • 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...
      XProfan X2.1, X3.1, X4.1 - XP-Pro SP2/3 & W7-Pro 64 - Mint Mate, AntiX