Delphi-PRAXiS
Seite 1 von 2  1 2      

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?


Alle Zeitangaben in WEZ +1. Es ist jetzt 18:03 Uhr.
Seite 1 von 2  1 2      

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