Thema: Delphi Progressbar einbinden

Einzelnen Beitrag anzeigen

Benutzerbild von isilive
isilive

Registriert seit: 15. Okt 2008
Ort: Österreich
192 Beiträge
 
Delphi 2009 Professional
 
#10

Re: Progressbar einbinden

  Alt 28. Okt 2009, 14:09
Danke himitsu!

Die unterschiedlichen Rechnergeschwindigkeiten sind gar kein so grosses Problem. Wenn meine Progressbar ca. 5 mal pro Sekunde aktualisiert wird, dann ist das schon voll in Ordnung. Das Hauptproblem an der Sache ist, dass eine Schleife die SEHR oft durchlaufen wird (bei mir im 6-8 Stelligen Bereich) nicht ausgebremst wird. Da würde es sich wahrscheinlich sogar lohnen die Abfrage in ASM zu machen, nur hab ich seit dem 6502 kein ASM mehr gemacht

Folgendes hatte ich zuerst. Die Routine braucht 16 Sekunden (statt 14 ohne Progressbar).

Delphi-Quellcode:
    PB1.Max := 100;
    While MStream.position <> MStream.size Do
      Begin
        //machwas
        if (MStream.Position and $FF) = 0 then
              PB1.Position := 100 * MStream.Position div MStream.Size;
      End;
Und jetzt 15 Sekunden (statt 14 ohne Progressbar):

Delphi-Quellcode:
    PB1.Max := 100;
    Start := GetTickCount;
    While MStream.position <> MStream.size Do
      Begin
        //machwas
          if gettickcount - start >= 200 then
          begin
            PB1.Position := 100 * MStream.Position div MStream.Size;
            //application.processmessages; //nicht notwendig
            Start := GetTickCount;
          end;
      End;
Funktioniert also beides sehr gut. Danke für den Tipp.

Nochmal zusammenfassend:
Delphi-Quellcode:
  PB1.Max := MStream.Size;
    While MStream.position <> MStream.size Do
    Begin
      //machwas
      PB1.stepit;
    End
scheidet ganz aus. Ist extrem langsam. Ebenso wie - für mich überaschenderweise:

Delphi-Quellcode:
    While MStream.position <> MStream.size Do
      Begin
        //machwas
        if (MStream.Position and $2000) = 0 then
              PB1.Position := 100 * MStream.Position div MStream.Size;
      End;
Also eine der zwei Varianten oben verwenden und es läuft effizient.
Stefan
Jedoch kann die referenzbasierte Implementierung des Standard-Objektmodells in Kombination mit den komplexen syntaktischen Dereferenzierungsregeln bei einer objektorientierten API wie ein Stolperstein wirken.
  Mit Zitat antworten Zitat