Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Verwendung einer ProgressBar (https://www.delphipraxis.net/203352-verwendung-einer-progressbar.html)

ManniSt 10. Feb 2020 16:36

Verwendung einer ProgressBar
 
Hi,

ich muss eine ganze Rehe von Nummern crunchen. Die beginnen bei X und enden bei Y. Das kann gfls. echt lange dauern. Nun habe ich da eine TProgressBar eingebaut:

ProgressBar.Min := X;
Progressbar.Max := Y;
ProgressBar.Step := 1;

for X := 1 to Y do
begin
irgendwas...
ProgressBar.StepIt;
ProgressBar.Update;
end;

Funktioniert soweit richtig gut. NUR...die Bar verzögert das Numbercruching um ganze Größenordnungen. Wie kann man das Teil beschleunigen oder gibt es eine schnellere Möglichkeit?

Manni

DieDolly 10. Feb 2020 16:40

AW: Verwendung einer ProgressBar
 
Zitat:

ich muss eine ganze Rehe von Nummern crunchen.
Es wäre echt schön, wenn du bei Deutsch bleiben würdest. Was bitte willst mit den Nummern machen?

hoika 10. Feb 2020 16:42

AW: Verwendung einer ProgressBar
 
Hallo,
wie groß ist denn Y?

ich würde z.B. nicht jeden Schritt (Number) das Stepit machen.

Wenn Du z.B. 10.000 Numbers hast, ändert sich in der Anzeige doch nichts.

Nimm eine lokale Variable zum Zählern der Numbers und zum Berechnen des prozentualen Fortschritts.

Und dann sowas wie

PG.Min:= 0;
PG.Max:= 100;

Delphi-Quellcode:
if Numbers mod iCountPercent = 5 then
begin
  PG aktualisieren
end;
Der PG würde also nur alle 5% deiner Numbers aktualisiert werden.

himitsu 10. Feb 2020 16:55

AW: Verwendung einer ProgressBar
 
[DEL "Falsches "Langsam" zuerst im Kopf gehabt und zuspät weitergelesen"]

Das ist eine Verbesserung des OS, die animieren die Ausgabe langsam beim Hochzählen.

Es gibt aus den Delphi-Demos ein vorinstalliertes TGauge, da es von Borland vor Jahrzehnten entwickelt wurde, ist dort auch rein garnichts optimiert oder verbessert wurden und demnach malt es seinen Zustand auch sehr schnell. :stupid:


Ansonsten bleibt nur Eines, denn Rückwärts wird umgehend aktualisiert.
Delphi-Quellcode:
ProgressBar.Position := ProgressBar.Position + 2; // bzw. ProgressBar.StepBy(2);
ProgressBar.Position := ProgressBar.Position - 1; // ProgressBar.StepBy(-1);
ProgressBar.Update;

// oder
ProgressBar.Position := ProgressBar.Max - 1;
ProgressBar.Position := Zähler;
ProgressBar.Update;
[/DEL]

Jupp, wenn es viele Schritte sind, die extrem schnell durchlaufen, dann ist das Überspringen ein sehr guttes Mittel, damit deine Fortschrittsanzeige nicht alles unnötig extrem ausbremst.
Wobei ich hier lieber mit einem zeitlichen Interval (100-500 Millisekunden) arbeite, anstatt mit einem festen Abstand, der überall anders schnell/langsam ist.
Delphi-Quellcode:
T := GetTickCount;
for ....

  if Integer(GetTickCount - T) > 250 then begin
    T := GetTickCount;
    ProgressBar.Position := i;
    ProgressBar.Update;
  end;

end;
ProgressBar.Position := Max; // wenn Anzeige nach Ende noch sichtbar bleibt

ManniSt 10. Feb 2020 17:06

AW: Verwendung einer ProgressBar
 
Danke für den Hinweis mit %, das ist tatsächlich deutlich schneller.

Manni

ManniSt 10. Feb 2020 17:15

AW: Verwendung einer ProgressBar
 
Das mit den Ticks ist anahezu optimal. Die Verzögerung ist tolerabel.

Danke für die brauchbaren Antworten!

Manni

Luckie 10. Feb 2020 17:57

AW: Verwendung einer ProgressBar
 
Warum extra rumrechnen?

Delphi-Quellcode:
for start := 1 to ende do
begin
  if start mod start = 5 then
  begin
    // mach was

p80286 10. Feb 2020 19:57

AW: Verwendung einer ProgressBar
 
Hab ich da etwas übersehen?
x mod x sollte immer 0 ergeben ?

Gruß
K-H

ManniSt 10. Feb 2020 20:01

AW: Verwendung einer ProgressBar
 
Korrekt.

Die Methode mit den Ticks ist allerdings DEUTLICH schneller (1-2 Größenordnungen).

Manni

Luckie 10. Feb 2020 20:20

AW: Verwendung einer ProgressBar
 
Mist. Ich sollte nicht versuchen zu programmieren mit starken Schmerzmitteln intus und Fentanyl Schmerzpflastern. :roll:

Wie würde denn meine Idee richtig umgesetzt aussehen?

ManniSt 10. Feb 2020 20:37

AW: Verwendung einer ProgressBar
 
Habe ich leider schon gelöscht, hat aber auch ordentlich funktioniert, war nur leider zu langsam, aber deutlich schneller als die herkömmliche Methode.

Gute Besserung.

Manni

Luckie 10. Feb 2020 20:41

AW: Verwendung einer ProgressBar
 
Himitsu hat ja erst noch alles in Prozent umgerechnet. Ich bin aber der Meinung, es ginge auch ohne Umrechnen. Nur habe ich mich da total total verkloppt.

Danke. Wird schon wieder.

p80286 10. Feb 2020 21:53

AW: Verwendung einer ProgressBar
 
Ich vermute mal so etwas:
Delphi-Quellcode:
Wert mod Faktor=1;
Wert wäre 0..Ende und mit Faktor bestimmst Du die Intervallgröße.
wobei
Delphi-Quellcode:
wert mod faktor=Ende mod faktor;
oder besser
Delphi-Quellcode:
c:=ende mod faktor;
.....
wert mod faktor=c;
genau auf dem letzten Wert ein "tuwas" veranlasst.

Gruß
K-H

Luckie 10. Feb 2020 22:23

AW: Verwendung einer ProgressBar
 
Danke. :thumb:

himitsu 11. Feb 2020 10:41

AW: Verwendung einer ProgressBar
 
Schneller ist das mit den Ticks nicht, eigentlich sogar langsamer als ein MOD,
aber die Verteilung der Anzeigevorgänge ist "humaner".

Auf schnelleren Rechnern wird es schneller, da weniger Ausgaben (mehr Durchläufe in gleicher Zeit)
und auf langsameren Rechnern wird es etwas langsamer, aber der Mensch muß nicht gleicheitig länger warten.



Früher hatte man auch sowas gemacht, dass man erstmal guckte wie lange ein paar bestimmte Vorgänge dauern und dann rechnete man sich daraus aus, alle vieviele Durchgänge man nun z.B. die Anzeige ansteuert.
Aber da sich CPUs heutzutage dynamisch takten, ist das nicht mehr so gut, als wie zu Zeiten, wo PCs noch einen Turbo-Knopf hatten, bzw. immer mit dem selben Takt liefen.

Zitat:

war nur leider zu langsam, aber deutlich schneller als die herkömmliche Methode.
Man könnte die Zeit ja an die jeweiligen Bedürfnisse anpassen.
Es lassen sich auch andere Counter/Timer verwenden, aber GetTickCount ist im Windows verfügbar und arbeitet direkt mit Millisekunden.


Es lassen sich die Rechenaufgaben auch in einen Thread verschieben und dann kann man die Anzeige z.B. über einen Timer regelmäßig synchronisieren.


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:45 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz