Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Programmieren allgemein (https://www.delphipraxis.net/40-programmieren-allgemein/)
-   -   Progressbar synchron zu rechenintensiven Code laufen lassen (https://www.delphipraxis.net/50875-progressbar-synchron-zu-rechenintensiven-code-laufen-lassen.html)

Alex_ITA01 2. Aug 2005 08:14


Progressbar synchron zu rechenintensiven Code laufen lassen
 
Hallo erstmal,
ich wollte mal fragen, ob es möglich ist, eine Progressbar synchron zu einem rechenintensiven Programmcode laufen zu lassen? Hört sich komisch an aber ich meine das so:
Ich habe ein Stück Code, der unterschiedlich lange dauern kann und ich weiß nicht wie lange (darin wird eine Liste sortiert aber unter bestimmten Kriterien). Je nachdem wie lang die Liste ist, kann es auch unterschiedlich lang dauern. Jetzt will ich aber, dass der Benutzer nicht denkt, es passiert nichts, eine Progressbar einblenden, die ihre Balken genau zur Geschwindigkeit des Programcode zeichnet. Also wenn die Routine fast fertig ist, dann soll die Progressbar fast voll sein und eben auch umgedreht und so weiter.
Nur wie macht man sowas?

MFG Alex

Stanlay Hanks 2. Aug 2005 09:25

Re: Progressbar synchron zu rechenintensiven Code laufen las
 
Guten Morgen. Da du "eine Liste sortierst", gehe ich davon aus, dass du eine Schleife verwendest. Wenn du die Anzahl der Schleifendurchläufe kennst, kann du vor dem Ausführen (Im Code also direkt vor der Schleife) die "Max" Eigenschaft der Progressbar auf die Anzahl der Schleifendurchläufe setzen und dann bei jedem Durchlauf den aktuellen Wert der Bar erhöhen.
Wenn du dem Benutzer nur signalisieren willst, dass dein Programm "nicht nichts macht", könnte es auch schon reichen, einfach mit einem Timer die Progressbar zu füllen, zu leeren, und wieder zu füllen. Also in etwa so, wie es z.B. beim Windows XP Bootscreen zu sehen ist.

Man liest sich, Stanlay :hi:

Alex_ITA01 2. Aug 2005 11:41

Re: Progressbar synchron zu rechenintensiven Code laufen las
 
Das mit dem Timer und der immerwieder durchlaufenden Progressbar ist eine gute Idee.
Das mit der Schleife funktioniert nicht ganz, weil das Sortieren in einer seperaten Komponente ausgeführt wird (QuickSort...) und die Progressbar soll nur in diesem Programm aufgerufen werden. Aber gute Idee,danke.

MFG Alex

BTeam 2. Aug 2005 12:13

Re: Progressbar synchron zu rechenintensiven Code laufen las
 
naja meiner Meinung nach tut es ein einfaches Panel mit dem Text "Sortiere...bitte waren" drauf auch. :)

BlackJack 2. Aug 2005 13:25

Re: Progressbar synchron zu rechenintensiven Code laufen las
 
oder eine kleine warteanimation a la
|
\
-
/
|
;)

Alex_ITA01 2. Aug 2005 13:56

Re: Progressbar synchron zu rechenintensiven Code laufen las
 
Ja klingt auch gut.Danke.
Problem ist nur, ich rufe eine Komponente auf, die sortieren soll und ich weiß noch nicht so ganz, wie ich das jetzt umsetzen soll...

Zur Zeit ist es in etwa so (habe den Source nicht parat):

- es wird auf eine bestimmte Zelle in einem StringGrid geklickt
- dann wird sortiert (MyStringGrid.Sort)
- und während dieser ".Sort" Procedure möchte ich diese Animation...
Wann soll die Animation wieder ausgestellt werden, wenn die "Sort-Procedure" unterschiedlich lange dauern kann?

So?

Delphi-Quellcode:
Progressbar.Visible := True;
MyStringGrid.Sort; // -> solange wie diese Funktion dauert soll die Progressbar sich "zeichnen"
Progressbar.Visible := False;
MFG Alex

BlackJack 2. Aug 2005 20:08

Re: Progressbar synchron zu rechenintensiven Code laufen las
 
Zitat:

Zitat von Alex_ITA01
Wann soll die Animation wieder ausgestellt werden, wenn die "Sort-Procedure" unterschiedlich lange dauern kann?

So?

Delphi-Quellcode:
Progressbar.Visible := True;
MyStringGrid.Sort; // -> solange wie diese Funktion dauert soll die Progressbar sich "zeichnen"
Progressbar.Visible := False;

ach so, du lässt einen TList-Abkömmling das Sortieren übernehmen? na dann wird das mit dem fortschritt in prozent schwierig, da diese .Sort-routine ja keine auskunft darüber gibt, wie weit sie ist. aber wenn du einfach nur eine progressbar haben willst, die immer wieder durchläuft, mach doch sowas:

Delphi-Quellcode:
ProgressBar1.Visible := True;
Timer1.Enabled := True;
MyStringGrid.Sort;
Timer1.Enabled := False;
ProgressBar1.Visible := False;
,
und im OnTimer-event lässt du dann einfach die progrssbar immer weiter laufen (bzw. zurücksetzen wenn sie den maximalwert erreicht hat).

wenn du wirklich willst, dass die progressbar den tatsächlichen fortschritt des sortierens zurückgibt, wirst du selber den sortieralgo schreiben müssen. wobei ich nicht glaube dass man z.b. beim QuickSort einen eindeutigen Fortschritt angeben kann (bei Bubblesort sollte das gehen, aber der wird wohl etwas zu langsam sein, oder?)

Alex_ITA01 11. Aug 2005 09:51

Re: Progressbar synchron zu rechenintensiven Code laufen las
 
ja, BubbleSort wird wohl zu langsam sein...
aber ich werde es mit der ständig durchlaufenden Progressbar machen.
Das ist die einfachste und schnellste Lösung.
Danke nochmals,
MFG Alex


Alle Zeitangaben in WEZ +1. Es ist jetzt 01:59 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