Progressbar

Ich habe ein Text Datei von 81271 Zeilen.
Diese lese ich ein und sortieren dem in ein Listbox über 4 Spalten, anschliesend wird aus diese Listbox weiter aussortierd nach 7 andere Listboxen mit verschiedenen Spaltenanzahl, von 3 bis 17).
Als Vorletztes werden verschiedene Spalten, welche mit Zahlen gefüllt sind, mit einander vergliechen und umgeändert.
Als Letzte wird aus dies 7 Listboxen ein SQLite Datei geschrieben.
Die ganse Vorgang, dauert ca. 4 Minuten. in diese Zeit sieht man nur ein kleine drehende bunte Kugel (Mac) und sonnst nichts.
Ich möchte hier ein Progressbar einbauen sodas man weist ob der Komputer arbeitet oder hängt.
Alle Beispiele, welche ich gefunden habe fuktionieren selbständig, aber keine läst sich in mein Programma einbauen.
Das ergebnis ist immer: Progressbar bleit grau, Bunte Kugel dreht, und wenn alles durch ist sind, auf ein schlag, alle Listboxen gefüllt und der Progressbar komplet blau.
Wer kennt sich hiemit aus und hat ein gute Vorschlag.?

Mögliche Ansätze:

  • Lege alle Datei und Datenbank Vorgänge in Threads.
  • Lasse die Threads in Properties, Variablen, Arrays, was auch immer (nicht mit der UI in Kontakt kommt) die Daten legen.
  • Lese die von den Threads ermittelten Daten per Timer in die Listboxen
  • Lese in einem Timer die Datenfortschritte ab und lasse diesen Timer die Progressbar aktualisieren.

Experimentiere mit den Thread Prioritäten um die UI nicht zu träge werden zu lassen :wink:

Der ganze Sortiervorgang muss in einen Thread ausgelagert werden. Nur dann bekommt das System Zeit, sich um andere Dinge wie ein Neuzeichen der GUI zu kümmern.

Im Thread muss dann z.B. in eine Property der Fortschrittswert geschrieben werden, und die Progressbar wird per Timer getriggert, liest diesen Wert und stellt sich drauf ein.

Falls die Listbox während des Sortieren aktualisiert wird, müssen diese Methoden aus dem Thread ausgelagert werden. Ein Thread darf ja nicht auf die GUI zugreifen. Das macht man am besten wieder per Schreiben der Werte in eine Property und Triggern eines Timers, der die Listbox-Manipulation übernimmt, oder eleganter mit Xojo.Core.Timer.Calllater mit Parameterübergabe.

Alles schön und gut, aber gibt es davon auch ein Beispiel, mit ein Hinweis wo ich dann Vorgänge hin legen muss=

Example Projects/Desktop/UpdatingUIFromThread/UIThreadingWithTimer.

Danke für den Hinweis, aber auf welche Stelle sollte ich meine Vorgänge einbauen?

Hoffe, ich kann ein wenig weiterhelfen.

Der Thread sortiert die Daten, addiert 1 zu einer Fortschrittsvariable (ein app.property als Nummer).
Der Timer fragt diese Fortschrittsvariable ab und ndert den Wert der Progressbar dementsprechend.

Ich bin gerade nicht an einer Entwicklermaschine, aber vielleicht kann ein Kollege hier eine kleine App erstellen in der 2 Threads etwas “machen”. Ein Thread ndert eine Variable hier, ein 2 Thread ndert eine Property hier und ein Timer wertet die Daten aus und aktualisiert die Progressbar?

Falls das gerade nicht geht. :slight_smile:

Ziehe ein Thread Objekt in das Fenster in dem die Progressbar ist und lasse den Thread seinen Fortschritt in eine Property des Window schreiben. Achte darauf das der Thread nicht mit der Benutzeroberflche arbeitet (keine Textfelder verndern, keine MsgBox anzeigen, …). Schreibe die Daten die in die ListBox(en) sollen in Arrays (als Property des Fensters, als Property eines Moduls, …), z.B. fr jede Listbox und dort fr jede Spalte ein Array (unbersichtlich aber fr den Einstieg gut geeignete Methode). Ziehe einen Timer in das Progressbar Fenster das regelmig den Fortschritt aus der oben zuerst erwhnten Variable/Property liest und in der Progressbar abbildet (stelle die PEriod des Timers nicht zu kurz ein. 250 - 500ms sollten reichen). Ziehe gegebenenfalls weitere Timer dorthin wo die ListBoxen sind und lasse diese Timer immer das 0 Element (das erste Element) fr die Liste und Spalte aus dem entsprechenden Array nehmen und das Element dann entfernen (Remove(0) oder so). Lasse die Timer “auslaufen” wenn die Threads im Status NotRunning sind oder die Arrays leer sind (und bleiben) oder oder oder.

Das alles kann man sehr viel eleganter und u.U. auch einfacher mit anderen Objekten erreichen. Aber fr den Einstieg wrde das denke ich funktionieren. Nur um das Prinzip zu erkennen.

Ich habe leider keine Zeit um mehr zu schreiben und kann wie gesagt gerade selbst nichts anderes anbieten. Ich hoffe das ich helfen konnte. :slight_smile: