AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Projekte Filedup 1.0.7.0 - Identische Dateien finden
Thema durchsuchen
Ansicht
Themen-Optionen

Filedup 1.0.7.0 - Identische Dateien finden

Ein Thema von bigg · begonnen am 21. Jul 2005 · letzter Beitrag vom 16. Jun 2007
Antwort Antwort
Seite 10 von 12   « Erste     8910 1112      
bigg
Kann gelöscht werden.
 
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#91
  Alt 9. Jan 2007, 18:59
Also dat versteh ich nicht ganz,
wieso übergibst du die Zeit SetStateTime(Project.CurrentTime);,
wenn du sie eh nicht verwendest?
Delphi-Quellcode:
procedure TStatusForm.SetStateTime(const Seconds: Cardinal);
begin
  TimeLabelContent.Caption := SecondsToHours(Project.CurrentTime);
end;
so wird's wohl gemeint sein.
Delphi-Quellcode:
procedure TStatusForm.SetStateTime(const Seconds: Cardinal);
begin
  TimeLabelContent.Caption := SecondsToHours(Seconds);
end;
Dann ist diese voll mißt, denn es zählt total falsch.
Nach dem oben schon erwähntem Szenario benötigt mein Programm 2,2 Stunden und deines hab ich nach über 2 stunden bei 11% abgebrochen, jedoch hatte es seiner Meinung nach bis dahin nur 1,5 Stunden gebraucht.
Im Extem gingen schonal in nur 30 Sekunden über 10 Sekunden auf deiner Uhr verloren.

Da OnTime durchschnittlich nicht alle genau einer Sekunde aufgerufen wird (ist bei deinem Programmaufbau garnicht möglich) muß falsch gezählt werden,
da zwar nach spätestens 1 Sekunde durch den Timer der Aufruf von TStatusForm.OnTime veranlaßt wird, aber durch die eher sperrliche Abarbeitung der Nachrichtenliste deiner Anwendung Einiges untergeht und verzerrt wird.
Es wird ja nur wärend Application.ProcessMessages die Nachrichtenliste abgearbeitet

> siehe TimeDemo (Anhang)
Da läuft ein Timer mit 100ms-Intervall.
Als Versuchswerte bieten sich 0, 50, 100 und 500 an:
- 0 und 50: zu vermuten wäre, daß wegen des geringeren Intervalls die Zeit fast genau wäre, dennoch fehlt Einiges.
- 100: hier könnte man auch 'ne Übereinstimmung vermuten, da beide Intervalls gleich sind.
- über 100 (Timer1.Intervall = 100) muß was fehlen, da hier das Intervall zu groß ist und dadurch auf Jedenfall die Nachrichtenverarbeitung verschleppt wird.


Besser du speicherst die Startzeit und rechnest die tatsächlich vergangene Zeit aus.
(GetTickCount + Integer-Cardinal-Konvertierung sollte hoffentlich mit den bis zu 24,86 Tagen ausreichen)
Delphi-Quellcode:
procedure TStatusForm.OnTime(Sender: TObject);
begin
  SetStateTime(GetTickCount - Project.CurrentTime);
end;

procedure TStatusForm.InitStateTime;
begin
  Project.CurrentTime := GetTickCount;
  SetStateTime(GetTickCount - Project.CurrentTime);
end;
Vergiß aber nicht die vergangene Zeit nach Scanende zu speichern (für deine Statistik).



Wenn ich die Laufzeit bei mir so sehe, dann wäre es nett, wenn man zwischen Cached- und NonCached-Dateioperationen auswählen könnte.
Vorallem ist es Schlimm, wenn nachdem (und natürlich auch wärend) dein Programm lief, alles was auf die Festplatte zugreift teilweise minutenlang braucht ... vorallem ganz nett im Explorer anzusehen ... is hier aber auch kein Wunder, denn schließlich braucht es 'ne kleine Weile, bis so 700-800 MB aus der Systemcache abgebaut und aufgeräumt wurden ... zum Glück paßt da bei mir zur Zeit nicht nochmehr rein ^^


Zitat:
Da müsste ich erst im Quelltext blättern, und nen bissle suchen
ich dachte man weiß in etwa, was man verbrockt hat

aber keine Sorge ... ich seh in deinem Quellcode och nicht so ganz durch ... anderer Codestil und total andere (mir unverständliche) Herangehensweise...




PS:
458.714 - 170 GB
164.051 - 9,45 GB


PSS: http://www.delphipraxis.net/internal...=663073#663073


Und dat Schaf:
ich liebe es ... is ja auch mein Sternzeichen (jap)

http://fnse.de/S05/1O6.gif http://fnse.de/S05/1O7.gif http://fnse.de/S05/1OA.gif http://fnse.de/S05/1OB.gif http://fnse.de/S05/1O8.gif http://fnse.de/S05/1OD.gif http://fnse.de/S05/1O9.gif http://fnse.de/S05/1OC.gif

Bin zwar nicht der Copyrightinhaber davon, allerding sollte es keine rechtlichen Probleme geben.
werd' aber bei Gelegenheit bei Natasja nochmal anfragen.
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

 
Delphi 2009 Professional
 
#92
  Alt 9. Jan 2007, 21:35
Zitat von bigg:
Zitat von XZise:
Wäre es möglich, dass man das Programm beendet, und nach einen neuen Start "weitersucht"?
Jupp, wäre möglich, dennoch fehlt mir im Moment die Zeit und Lust. Viel wichtiger wäre es, den Suchprozess zu optimieren, dann könnte man sich das gleich sparen.^^
Da wäre ich mir nicht sicher Ich habe länger als 2 Stunden gebraucht
Du müsstest also sehr viel raushauen, um da wirklich die Pause zu sparen
Fabian
  Mit Zitat antworten Zitat
bigg
 
#93
  Alt 9. Jan 2007, 22:45
Naja, solchen Käse verzapft doch jeder mal...

Delphi-Quellcode:
  Function SizeToString(Size: LargeInt): String;
    Var i: LargeInt;

    Begin
      i := Abs(Size);
      If i < 1000 Then Result := Format('%.0n B', [Size / 1])
      Else If i < 10235 Then Result := Format('%.2n KB', [Size / 1024])
      Else If i < 102349 Then Result := Format('%.1n KB', [Size / 1024])
      Else If i < 1023488 Then Result := Format('%.0n KB', [Size / 1024])
      Else If i < 10480518 Then Result := Format('%.2n MB', [Size / 1048576])
      Else If i < 104805172 Then Result := Format('%.1n MB', [Size / 1048576])
      Else If i < 1048051712 Then Result := Format('%.0n MB', [Size / 1048576])
      Else If i < 10732049531 Then Result := Format('%.2n GB', [Size / 1073741824])
      Else If i < 107320495309 Then Result := Format('%.1n GB', [Size / 1073741824])
      Else If i < 1073204953088 Then Result := Format('%.0n GB', [Size / 1073741824])
      Else If i < 10989618719622 Then Result := Format('%.2n TB', [Size / 1099511627776])
      Else If i < 109896187196212 Then Result := Format('%.1n TB', [Size / 1099511627776])
      Else If i < 1098961871962112 Then Result := Format('%.0n TB', [Size / 1099511627776])
      Else If i < 11253369568892027 Then Result := Format('%.2n PB', [Size / 1125899906842624])
      Else If i < 112533695688920269 Then Result := Format('%.1n PB', [Size / 1125899906842624])
      Else If i < 1125336956889202688 Then Result := Format('%.0n PB', [Size / 1125899906842624])
      Else Result := Format('%.2n EB', [Size / 1152921504606846976]);
    End;


Recht haste aber trotzdem mit dem Counter. War im übrigen bekannt, man muss nur ein paar mal hintereinander 'Pause ' drücken, während "er" rödelt. Das ich allerdings die globale Variable dafür benutze, war nicht geplant. Haste ja rischtisch gesacht und werdsch mal ändern.

Zitat von himitsu:
ich dachte man weiß in etwa, was man verbrockt hat Grübelnd...

aber keine Sorge ... ich seh in deinem Quellcode och nicht so ganz durch ... anderer Codestil und total andere (mir unverständliche) Herangehensweise... Angel
Hab schon schlimmeres gesehen.
Aber vielleicht kann ich dir ja och noch uff de Sprünge helfen und dir einiges erklären.

PS: Wäre schön, wenn der Copyright-Inhaber nichts dagegen hätte.

@XZise: Da geht in jedem Fall noch was. Mein Zufallsgenerator muss nur irgendwann den richtigen Code ausk*****.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#94
  Alt 10. Jan 2007, 17:34
upps, vergessen die Datei mit hochzuladen


Zitat von bigg:
SizeToString...

was dagegen?

Wert immer maximal 3-stellig und dann sind die Werte speziell auf das standardmäßige Rundungsverhalten der FPU abgestimmt.
Und ja, es ist mit Absicht mit IF und nicht über CASE gelöst


PS: Sheepo ... sie hatte so jedenfalls (soweit ich es noch weiß) nie verboten gahabt,
's is aber bestimmt auch schon über 1,5 Jahre her, dat ich die Kleinen fand.
Angehängte Dateien
Dateityp: zip timetest_120.zip (150,4 KB, 37x aufgerufen)
  Mit Zitat antworten Zitat
bigg
 
#95
  Alt 10. Jan 2007, 18:19
moin moin,

Warum if und case verwenden, wenn es auch iterativ zu lösen ginge?
Nur der Rundung halber?

Delphi-Quellcode:
function FileSizeToString(const FileSize: Int64): String;
const Measure: Array[0..4] of String = ('Byte', 'KB', 'MB', 'GB', 'TB');
var NewSize: Currency;
var i: Integer;
begin
  Result := '';

  if FileSize > -1 then
  begin
    i := 0;
    NewSize := FileSize;

    while (NewSize >= 1024) do
    begin
      NewSize := NewSize / 1024;
      Inc(i);
    end;

    case i of
      0: Result := FloatToStr( NewSize );
      1,
      2,
      3: Result := FormatFloat('0.00', NewSize);
      4: Result := FormatFloat('0.000', NewSize);
    else Result := FloatToStr( NewSize );
    end;

    Result := Result + #32 + Measure[i];
  end;
end;
PS: TimeTest hab ich mir angesehen, werd ich wie gesagt nochmal fixen.
Und @alle die ihre Farben ändern, aber sich wundern, warum im Report andere Farben auftauchen, is so,
nich wundern ;>.
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

 
Delphi 12 Athens
 
#96
  Alt 10. Jan 2007, 18:32
meines bekommt keine Rundungsfehler ('s wird ja nirgends was umgerechnet), ist schneller und warum erst in 'ner Schleife mit langsamen Fließkommazahlen rechnen, wenn doch einfache Integervergleiche ausreichen

und deines zeigt doch bestimmt 1010 Byte als 1010 Byte an ... meines als 0,99 KB ... wie gesagt, ich wollte genau 3 Stellig haben und nicht nur meistens, oder so in etwa...

schau dir doch mal die Integer-Vergleichswerte an ... es hat 'nen Grund, dat die krum und bucklig sind (z.B. 10235 statt 10240)
  Mit Zitat antworten Zitat
bigg
 
#97
  Alt 10. Jan 2007, 18:54
[ot]
Schau dir doch mal an, was der Windows Explorer (Datei->Eigenschaften) bei 1010 Byte anzeigt.
Das der Datentyp Currency nur 4 Nachkommastellen aufnimmt, ist für diese Berechnung auch nicht weiter schlimm, schließlich zeige ich auch nur maximal 3 Stellen hinter dem Komma an.

Wie och immer...so hat jeder seine eigene Logik...
PS: Und ganz Explorer-Like arbeitet meine Funktion nicht...woltsch nur anmerken
[/ot]
  Mit Zitat antworten Zitat
bigg
 
#98
  Alt 19. Jan 2007, 01:37
moin moin,

eine neue Version ist oben und darf getestet werden.

1.0.5.0
- Optimierung der Suche
- Dauer der Suche wurde falsch berechnet
- Stop bricht nun sofort einen Suchvorgang ab
- Breiten aller Spalten (Dateiliste) werden nun gesichert
- Sortierung der Spalten 'Name', 'Verzeichnis' und 'Typ' arbeiteten nicht korrekt
- eine Zusammenfassung eines Suchlaufs kann nun in die Zwischenablage kopiert werden
  Mit Zitat antworten Zitat
Benutzerbild von xZise
xZise

 
Delphi 2009 Professional
 
#99
  Alt 21. Jan 2007, 11:04
Zu euren Größenpräfixen:
Sie brauchen für eine Berechnung von 100.000 mal ungefähr 62 ms Also ist es eigentlich egal, was ihr verwendet.
(Dateigröße: 123456 Byte)

Zusätzlich habe ich noch die "Thousands"-Methode entwickelt, welche zuerst ausrechnet, welche Tausenderpotenz es hat, und das dann als Potenz nimmt zur Berechnung.
Dummerweise ist es nicht schneller Ganz im Gegenteil... ~ 125 ms für 100.000 Berechnungen.

PS: Ich rechne mit "GetThreadTimes"
Angehängte Dateien
Dateityp: exe praefixrechner_188.exe (428,0 KB, 22x aufgerufen)
Fabian
  Mit Zitat antworten Zitat
bigg
 
#100
  Alt 21. Jan 2007, 11:32
moin moin,

@XZise: Beide Funktionen sind schnell genug, um die Aufgabe zu lösen. Sie werden hauptsächlich beim Zeichnen des Grids verwendet, im Endeffekt also keine 1000 aufgerufen pro Zeichnung. Somit dürfte der Zeitunterschied = 0 betragen. Darum ging es aber auch gar nicht, es ging um Programmier-Stil.

Gruss bigg
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 10 von 12   « Erste     8910 1112      


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 09:56 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