Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Form hängt sich bei der Schleife auf (https://www.delphipraxis.net/173225-form-haengt-sich-bei-der-schleife-auf.html)

Back2Code 13. Feb 2013 11:04

Delphi-Version: XE2

Form hängt sich bei der Schleife auf
 
Meine Form gibt keine Rückmeldung mehr, auch nicht die Progressbar erst wenn die Schleife beendet ist geht sie mit einem Ruck voll.

Hier die prozedur:
Delphi-Quellcode:
// 1 MB = 1048576 Byte
procedure TForm2.BumpExe(sPfad: string);
var i: integer;
    buffer : TBytes;
    dataByte: Byte;
begin
  FileStream := (TFileStream.Create(sPfad, fmOpenWrite,fmShareDenyNone));
  ProgressBar1.Position := 0;
  try
    SetLength(Buffer, FileStream.Size); //Buffergröße anhand des Filestreamsize festlegen
    SetLength(bytearray, FileStream.Size); //Bytearray anhand des Filestreamsize festlegen
    ProgressBar1.Max := Length(Buffer);
    fileStream.seek(0,soFromEnd);
    dataByte := 0;
    Progressbar1.Max := berechneteteBytes;
    for i := 1 to berechneteteBytes do
      begin
        FileStream.WriteBuffer(dataByte,1);
        ProgressBar1.Position :=i;
      end;
  finally
    MessageDlg('Exe wurde erfolgreich um ' + IntToStr(berechneteteBytes) + ' Bytes gepumpt. ', mtInformation, [mbOK], 0);
    FileStream.Free;
  end;
end;

Wie kann ich die Schleife jetzt so optimieren, dass sich das Programm während der Schleife nicht mehr aufhängt :)?

EWeiss 13. Feb 2013 11:18

AW: Form hängt sich bei der Schleife auf
 
Ein

Delphi-Quellcode:
Application.ProcessMessages;

könnte in dem Fall abhilfe schaffen.

Delphi-Quellcode:
    for i := 1 to berechneteteBytes do
       begin
         FileStream.WriteBuffer(dataByte,1);
         ProgressBar1.Position :=i;
         Application.ProcessMessages;
       end;
gruss

Back2Code 13. Feb 2013 12:08

AW: Form hängt sich bei der Schleife auf
 
Funktioniert. Dankeschön für die Hilfe. Kann gecloseed werden.

sx2008 13. Feb 2013 17:27

AW: Form hängt sich bei der Schleife auf
 
Wenn du jedes Byte einzeln kopierst dann bist du ca 50-fach langsamer als wenn du jeweils 4K-Byte Blöcke kopierst!
Ausserdem bremst die häufige Aktualiserung des Progressbars noch zusätzlich den Ablauf.

Luckie 13. Feb 2013 20:04

AW: Form hängt sich bei der Schleife auf
 
Threads wären hier wohl angebracht.

Back2Code 14. Feb 2013 07:29

AW: Form hängt sich bei der Schleife auf
 
Zitat:

Zitat von sx2008 (Beitrag 1203370)
Wenn du jedes Byte einzeln kopierst dann bist du ca 50-fach langsamer als wenn du jeweils 4K-Byte Blöcke kopierst!
Ausserdem bremst die häufige Aktualiserung des Progressbars noch zusätzlich den Ablauf.

Habs so gemacht:

Code:
    optimiert := berechneteteBytes div 1024;
    Progressbar1.Max := optimiert; //
    for i := 1 to optimiert do
      begin
        FileStream.WriteBuffer(dataByte, 1024);
        ProgressBar1.Position :=i;
        Application.ProcessMessages;
      end;

Luckie 14. Feb 2013 09:26

AW: Form hängt sich bei der Schleife auf
 
Es reicht wahrscheinlich aus, wenn du die Fortschrittsanzeige nur bei jedem 10. Durchlauf aktualisierst. Dann wird es noch mal schneller, was das langsamste an dem Code ist sehr wahrscheinlich das Aktualisieren und Neuzeichen der Fortschrittsanzeige.

sx2008 14. Feb 2013 10:27

AW: Form hängt sich bei der Schleife auf
 
Zitat:

Zitat von Robin2k (Beitrag 1203421)
Habs so gemacht:
Delphi-Quellcode:
    optimiert := berechneteteBytes div 1024;
    Progressbar1.Max := optimiert; //
    for i := 1 to optimiert do
      begin
        FileStream.WriteBuffer(dataByte, 1024);
        ProgressBar1.Position :=i;
        Application.ProcessMessages;
      end;

Was jetzt noch fehlt sind 2 Dinge:
1.) muss die Variable "dataByte" einen anderen Namen (und Typ) bekommen und natürlich immer auch mit 1024 Bytes gefüllt sein
2.) darf man den Rest am Ende nicht vergessen. Dazu die Restlänge mit
Delphi-Quellcode:
mod
berechnen und mit
Delphi-Quellcode:
WriteBuffer
wegschreiben. Die Aktualiserung des Progressbars ist dabei nicht mehr sinnvoll.


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:26 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