AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Progressbar einbinden

Ein Thema von razer91 · begonnen am 17. Aug 2009 · letzter Beitrag vom 28. Okt 2009
Antwort Antwort
Seite 1 von 2  1 2   
razer91

Registriert seit: 17. Aug 2009
20 Beiträge
 
#1

Progressbar einbinden

  Alt 17. Aug 2009, 11:25
Hallo Zusammen!

Folgendes Problem:

Ich hab eine Programm, das in eine Textdatei schreibt und zwar mit einer "for"-Schleife.

Frage:

Wie kann ich, ohne das Programm (also die Schreibgeschwindigkeit) zu sehr auszubremsen, eine Progressbar einbinden, die den Vorgang visuell veranschaulicht.
folgendes ist mir schon klar^^:
Delphi-Quellcode:
progressbarX.max := gesamte schreibvorgänge;
progressbarX.stepby (1);
progressbarX.stepit; // balken wird bei jeden schreibvorgang um '1' weiter geschoben;
Ich habe schon einiges probiert, allerdings füllt sich sie progressbar immer am Ende auf 100%, weil das ergebnis der Schleife natürlich am ende nur einmal ausgegeben wird (nämlich, dass er fertig mit schreiben ist), die Zwischenergebnisse, die jetzt wichtig für die progressbar sind bekomme irgendwie nicht aus dieser schleife raus
ich habs auch schon mit einem Timer versucht, hat aber auch nicht so richtig gefunzt

folgende befehle, fällt mir gerade ein hab ich auch schon probiert, naja.. also entweder an die falsche Stelle geschrieben, oder... naja hier die befehle:
Delphi-Quellcode:
progressbarX.update;
application.processmessages;
Jemand ne Idee? ich glaub auch ich habs fast richtig, aber irgendwie fehlt noch der letzte, entscheidene Geistesblitz (oder auch nicht )

Vielen Dank schon mal!
Flo
  Mit Zitat antworten Zitat
Benutzerbild von iKilledKenny
iKilledKenny

Registriert seit: 25. Apr 2007
Ort: Bergstrasse
49 Beiträge
 
Delphi 5 Professional
 
#2

Re: Progressbar einbinden

  Alt 17. Aug 2009, 11:29
Wie sieht denn die For-Schleife aus?
Alexander Stork
  Mit Zitat antworten Zitat
razer91

Registriert seit: 17. Aug 2009
20 Beiträge
 
#3

Re: Progressbar einbinden

  Alt 17. Aug 2009, 11:32
also das ist jetzt nur die Schleife, wenn du mehr oder alles brauchst einfach sagen :

Delphi-Quellcode:
for writerounds := 0 to filesize do
 write (tf, '0'); //wobei 'tf' die Textfile ist
 closefile (tf);
end
Flo
  Mit Zitat antworten Zitat
Benutzerbild von Stevie
Stevie

Registriert seit: 12. Aug 2003
Ort: Soest
4.008 Beiträge
 
Delphi 10.1 Berlin Enterprise
 
#4

Re: Progressbar einbinden

  Alt 17. Aug 2009, 11:36
Das aktualisieren der ProgressBar muss in den Schleifenrumpf:
Delphi-Quellcode:
for writerounds := 0 to filesize do
begin
  write(tf, '0');
  ProgressbarX.StepIt;
  Application.ProcessMessages;
end;
closefile(tf);
Stefan
“Simplicity, carried to the extreme, becomes elegance.” Jon Franklin

Delphi Sorcery - DSharp - Spring4D - TestInsight
  Mit Zitat antworten Zitat
razer91

Registriert seit: 17. Aug 2009
20 Beiträge
 
#5

Re: Progressbar einbinden

  Alt 17. Aug 2009, 11:47
Danke! Hat gefunzt!

Ist jetzt aber sehr langsam geworden, lässt sich das vermeiden?
Flo
  Mit Zitat antworten Zitat
Benutzerbild von DeddyH
DeddyH

Registriert seit: 17. Sep 2006
Ort: Barchfeld
27.537 Beiträge
 
Delphi 11 Alexandria
 
#6

Re: Progressbar einbinden

  Alt 17. Aug 2009, 11:51
Aktualisiere die Progressbar nur bei jedem z.B. 10. Durchlauf, dann sollte das auch schneller gehen.
Detlef
"Ich habe Angst vor dem Tag, an dem die Technologie unsere menschlichen Interaktionen übertrumpft. Die Welt wird eine Generation von Idioten bekommen." (Albert Einstein)
Dieser Tag ist längst gekommen
  Mit Zitat antworten Zitat
razer91

Registriert seit: 17. Aug 2009
20 Beiträge
 
#7

Re: Progressbar einbinden

  Alt 17. Aug 2009, 11:52
Alles klar! Vielen Dank Leuzt!!
Flo
  Mit Zitat antworten Zitat
Benutzerbild von isilive
isilive

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

Re: Progressbar einbinden

  Alt 28. Okt 2009, 05:42
Ich habe eine Schleife die ziemlich oft (im Testlauf 62 Mio. mal) durchlaufen wird und versuche gerade verschiedene Möglichkeiten die Progressbar nicht zu oft zu aktualisieren:

Durchlaufdauer im Testlauf
ohne Progressbar : 14 Sek.

PB aktualisieren mit:

IF i AND $FF = 0 : 16 Sek.
IF i AND $2000 = 0 : 52 Sek.
IF i mod 1000 = 0 : 17 Sek.
immer: : 79 Sek.

Es wundert mich, dass "AND $2000" so langsam ist, aber ok.
Und es wundert mich sehr, dass "AND $FF" so schnell ist, weil die Aktualisierung der ProgressBar in diesem Testlauf ca. 242.000 mal stattfindet.
Kennt jemand noch bessere / elegantere Arten das zu lösen?
(Timer ist mir irgendwie nicht sympatisch - mann muss die Zählvariable rüberkriegen und die Aktualisierung hat auch nicht funktioniert)
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
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
43.114 Beiträge
 
Delphi 12 Athens
 
#9

Re: Progressbar einbinden

  Alt 28. Okt 2009, 07:10
http://www.delphipraxis.net/internal...094547#1094547

Das Problem bei sowas ist:
- Rechner sind unterschiedlich schnell
- sie sind auch unterschiedlich ausgelastet
- und durch verschiedene Faktoren ist auch die Schleife nicht immer gleich schnell

früher versuchte man es so, daß man erstmal die geschwindigkeit des PCs gemessen hat,
dann daraus sich berechnete, alle wieviel Tackte/Durchläufe man etwas machen mußte, damit es etwa dem Intervall entsprech, welches man wollte, aber

- PCs sind heute auch nicht immer gleich schnell
> vorallem da (nicht wie unter DOS) mehere Programme gleichzeitig laufen
> und auch CPUs mal unterschiedlich getaktet sind (mein kleiner AMD ändert seinen Takt, je nach Auslastung)

also bleibt nur Eines:
immer schön und ständig erneut nachmessen und sich nicht an feste Werte halten, aber dennoch zeitlich unterschiedliche Werte, wie wie irgendwelche Durchlaufsanzahlen.


[add]
und was das Problem von razer91 angeht,
also die Datei Byteweise befüllen zu wollen und auch nochjedes Byte einzeln anzuzeigen ... selbst der Tipp mit "10. Durchlauf" ist da nicht wirklich sinnvoll, da dieses immernoch NUR 10 Byte pro Schritt sind ... ist vollkommen "irre".
heutige Festplatten schieben (wenn sie halbwegs richtig bediehnt werden) mehrere dutzend/hundert MB in der Sekunde durch
und sowas geht nicht, wenn man sie nur mit so Kleinkram füttert.
Garbage Collector ... Delphianer erzeugen keinen Müll, also brauchen sie auch keinen Müllsucher.
my Delphi wish list : BugReports/FeatureRequests
  Mit Zitat antworten Zitat
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
Antwort Antwort
Seite 1 von 2  1 2   

Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:13 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