Autor Beitrag
svennissel
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Mo 07.11.05 14:07 
Hallo Leute,

ich habe in Delphi 2005 ein win32 Programm geschrieben, dass viele Daten einer Datenbank konvertiert.
Damit ich den Fortschritt angezeigt bekomme habe ich eine Progressbar benutzt.
Mein vorgehen:

ausblenden Delphi-Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
9:
progress.Step := 1;
progress.smooth := false;
progress.Min := 0;
progress.Max := anzahlDerDatensaetze;
while db.hasNext() do
begin
  ...
  progress.StepIt();
end;


Wenn ich nun 100 Datensäte habe überhaut kein Problem. Der Balken geht gleichmäßig bis zum Ende. Wenn ich aber 50.000 Datensäte habe und ich das Fenster verlasse und ein anderes Programm in den vordergrund hole oder ich mein Programmfenster verschiebe, dann hält die Progressbar an bis das Programm komplett fertig ist.

Zusätlich ist zu sagen, dass das Programm keine 100% CPU last hat, aber ein Programm mit niedriger priorität (ähnliches Programm wie Seti@home) hat die resteliche CPU Auslastung.

Ich kenne es von Java, dass der Thread der für das Zeichnen der Grafik zuständig ist mit niedriger priorität läuft. Kann ich entweder dem Frame/Form höhere priorität zum Zeichnen geben oder das neuzeichnen manuell anstoßen(was die nicht so schöne Lösung wäre).
Benutzername
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 210

Win XP Pro
Delphi 7 PE, D2005 Prof. SSL
BeitragVerfasst: Mo 07.11.05 14:18 
Du könntest in die while-Schleife ein Application.ProcessMessages reinpacken, das veranlasst, dass die Messages in der MessageQueue für das Programmfenster sofort verarbeitet werden.
svennissel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Mo 07.11.05 14:29 
Da habe ich ein Problem. Ich habe den Code in einer eigenen Unit/Klasse. In der Klasse kann ich nicht Application.ProcessMessages() ausführen und auch nicht TApplication einbinden.
svennissel Threadstarter
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starontopic star
Beiträge: 22



BeitragVerfasst: Mo 07.11.05 14:33 
Danke für den Tipp.

Ich habe einfach einen Timer in das Programm eingebaut und dann alle 5 Sekunden Application.ProcessMessages() ausgeführt.
Benutzername
ontopic starontopic starontopic starontopic starontopic starontopic starofftopic starofftopic star
Beiträge: 210

Win XP Pro
Delphi 7 PE, D2005 Prof. SSL
BeitragVerfasst: Mo 07.11.05 16:07 
Hmm, den Timer find ich immer recht 'unschön'.
Versuch mal, in deiner Schleife ProgressBar1.Repaint (oder wars .Update? Naja, probiers aus *g*) zu verwenden, dan müssts auch ohne Timer funzen :)