![]() |
Verschachtelte Schleifen - Gesamtfortschritt
Ich habe zwei verschachtelte Schleife:
Delphi-Quellcode:
Wie ermittele ich jetzt in der inneren Schleife den Gesamtfortschritt? Ich stehe da irgendwie auf dem Schlauch. :?
for i := 0 to x do
begin while j < y do begin // hier Gesamtfortschritt ermitteln end; end |
Re: Verschachtelte Schleifen - Gesamtfortschritt
i*y+j
wenn j bei 0 anfängt |
Re: Verschachtelte Schleifen - Gesamtfortschritt
Wie meinst du das? Wie wird j erhöht?
|
Re: Verschachtelte Schleifen - Gesamtfortschritt
j wird immer um eins inkrementiert. Und ich sehe, da gibt es noch eine kleine Hürde, vor der while-Schleife wird die Zählvariable der while-Schleife immer auf null gesetzt:
Delphi-Quellcode:
Ich denke, da bräuchte ich eine Hilfsvariable: j_total := j_total + j oder so was.
for i := 0 to x do
begin j := 0; // <-- !!! while j < y do begin j_total := j_total + j // hier Gesamtfortschritt ermitteln end; end @sirius: Ich bräuchte es in Prozent. :oops: |
Re: Verschachtelte Schleifen - Gesamtfortschritt
Naja, dann noch durch y*(x+1) teilen. Aber warum nimmst du eine While-Schleife? Kann es sein, das y hin und wieder schwankt oder j nicht bei 0 anfängt?
Edit: Teil 2 hat sich grad geändert :mrgreen: |
Re: Verschachtelte Schleifen - Gesamtfortschritt
( i*y+j ) / ( x*y ) * 100 = Prozent
Position Maximum |
Re: Verschachtelte Schleifen - Gesamtfortschritt
Richtig sähe es so aus:
Delphi-Quellcode:
Damit wird eine Datei sicher gelöscht durch mehrmaliges Überschreiben mit bestimmten Bitmustern.
PosTotal := 0;
for Pass := 0 to FOverWriteCount do begin // Schreibpuffer füllen for i := 0 to Length(Buffer) div SizeOf(TTrippleByte) - 1 do if (Pass < Low(Mask)) or (Pass > High(Mask)) then begin Buffer[i * SizeOf(TTrippleByte)] := Random(256); Buffer[i * SizeOf(TTrippleByte) + 1] := Random(256); Buffer[i * SizeOf(TTrippleByte) + 1] := Random(256); end else PTrippleByte(@Buffer[i * SizeOf(TTrippleByte)])^ := Mask[Pass]; // Datei überschreiben SetFilePointer(H, 0, nil, FILE_BEGIN); Pos := 0; while Pos < Sectors do begin PosTotal := PosTotal + Pos; // MP SendMessage(Parent, FCM_DELFILE_PROG, Trunc((Pass* (Sectors+PosTotal)) / (FOverWriteCount * Sectors) * 100), 0); i := Min(Sectors - Pos, Length(Buffer) div Integer(SectorSize)); if not WriteFile(H, Buffer[0], i * SectorSize, W, nil) or (Integer(W) <> i * SectorSize) then Exit; Inc(Pos, i); end; end; |
Re: Verschachtelte Schleifen - Gesamtfortschritt
Du tust übrgiens FOverwritecount+1 mal die Datei überschreiben.
Und du durchläufst die Whileschleife in i-Schritten, wobei i anfangs konstant bei "length(buffer) div Sectorsize" und im letzten Durchgang meist auf Sectors-Pos fällt. Damit hat die while-Schleife immer Sectors/(length(buffer) div Sectorsize) Druchläufe (evtl. einen mehr) und die For-Schleife hat FWriteCount+1 Druchläufe. Die musst du nur multiplizieren. |
Re: Verschachtelte Schleifen - Gesamtfortschritt
Ich werde noch mal wahnsinnig:
Delphi-Quellcode:
Das liefert mindestens um den Faktor 1.000 zu hohe Werte. :wall:
PosTotal := 0;
for Pass := 0 to FPassCount - 1 do begin if Assigned(OnShredderPass) then OnShredderPass(self, Pass + 1, FPassCount); // Schreibpuffer füllen for i := 0 to Length(Buffer) div SizeOf(TTrippleByte) - 1 do if (Pass < Low(Mask)) or (Pass > High(Mask)) then begin Buffer[i * SizeOf(TTrippleByte)] := Random(256); Buffer[i * SizeOf(TTrippleByte) + 1] := Random(256); Buffer[i * SizeOf(TTrippleByte) + 1] := Random(256); end else PTrippleByte(@Buffer[i * SizeOf(TTrippleByte)])^ := Mask[Pass]; // Datei überschreiben SetFilePointer(H, 0, nil, FILE_BEGIN); Pos := 0; while Pos < Sectors do begin i := Min(Sectors - Pos, Length(Buffer) div Integer(SectorSize)); if not WriteFile(H, Buffer[0], i * SectorSize, W, nil) or (Integer(W) <> i * SectorSize) then Exit; Inc(Pos, i); if Assigned(OnShredderProgress) then begin PosTotal := PosTotal + Pos; // MP p := ((PosTotal / Sectorsize) / (FPassCount * Sectors/(length(buffer)) / Sectorsize) * 100); // !!! OnShredderProgress(self, Trunc(p)); end; end; end; |
Re: Verschachtelte Schleifen - Gesamtfortschritt
Zitat:
(i*y+j) / ((x+1)*y) * 100 = Prozent |
Re: Verschachtelte Schleifen - Gesamtfortschritt
Ich glaube meine Vereinfachung zu Anfang war nicht ganz korrekt, siehe meine folge Postings.
|
Re: Verschachtelte Schleifen - Gesamtfortschritt
Delphi-Quellcode:
SchritteGesamt:=Sectors div (Length(Buffer) div SectorSize) * FPassCount ;
SchritteAktuell:=Pos div (Length(Buffer) div SectorSize) + Sectors div (Length(Buffer) div SectorSize) * Pass; Prozent:=trunc((SchritteAktuell/SchritteGesamt) *100); Funktioniert zumindest in meinem Beispiel:
Delphi-Quellcode:
uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, ComCtrls, MAth, CommCtrl; type TForm1 = class(TForm) ProgressBar1: TProgressBar; Button1: TButton; procedure Button1Click(Sender: TObject); procedure getmsg(var msg:TMessage);message WM_User; private { Private-Deklarationen } public { Public-Deklarationen } end; var Form1: TForm1; implementation {$R *.dfm} type PContent=^TContent; Tcontent=record ProgressWnd:hwnd; FormWnd:hwnd; Sectors:integer; SectorSize:integer; FPassCount:integer; LengthBuffer:integer; end; function test(aParam:PContent):integer; var i,Pos,Pass:integer; Param:TContent; Prozent:integer; SchritteGesamt, Schritte:integer; begin Param:=aParam^; dispose(aParam); try for Pass:=0 to param.FPassCount-1 do begin Pos:=0; while Pos < param.Sectors do begin i:=Min(param.Sectors - Pos, param.LengthBuffer div param.SectorSize); inc(Pos,i); SchritteGesamt:=param.Sectors div (param.LengthBuffer div param.SectorSize) * Param.FPassCount ; Schritte:=pos div (param.LengthBuffer div param.SectorSize) + param.Sectors div (param.LengthBuffer div param.SectorSize)*Pass; Prozent:=trunc((Schritte/SchritteGesamt) *100); postmessage(param.ProgressWnd,PBM_SETPOS, Prozent, 0); sleep(200); end; end; finally postmessage(param.ProgressWnd,PBM_SETPOS, 0, 0); postmessage(param.FormWnd,WM_User,0,0); end; end; procedure TForm1.Button1Click(Sender: TObject); var temp:cardinal; Param:PContent; begin new(Param); PAram.ProgressWnd:=progressbar1.Handle; Param.FormWnd:=self.handle; Param.Sectors:=20; Param.SectorSize:=100; Param.FPassCount:=4; Param.LengthBuffer:=300; BeginThread(nil,0,@test,param,0,temp); Button1.Enabled:=false; end; procedure Tform1.getmsg(var msg:TMessage); begin Button1.Enabled:=true; end; end. |
Re: Verschachtelte Schleifen - Gesamtfortschritt
Zitat:
Delphi-Quellcode:
Ich hoffe, da ist jetzt kein Fehler drin. :stupid:
SchritteGesamt:=Sectors * SectorSize * FPassCount div Length(Buffer);
SchritteAktuell := (SectorSize div Length(Buffer)) * (Pos + Pass*Sectors); Prozent:=trunc((SchritteAktuell/SchritteGesamt) *100); |
Re: Verschachtelte Schleifen - Gesamtfortschritt
:firejump: So klappt es. :P Danke noch mal an alle.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 22:09 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz