![]() |
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 :)? |
AW: Form hängt sich bei der Schleife auf
Ein
Delphi-Quellcode:
Application.ProcessMessages;
könnte in dem Fall abhilfe schaffen.
Delphi-Quellcode:
gruss
for i := 1 to berechneteteBytes do
begin FileStream.WriteBuffer(dataByte,1); ProgressBar1.Position :=i; Application.ProcessMessages; end; |
AW: Form hängt sich bei der Schleife auf
Funktioniert. Dankeschön für die Hilfe. Kann gecloseed werden.
|
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. |
AW: Form hängt sich bei der Schleife auf
Threads wären hier wohl angebracht.
|
AW: Form hängt sich bei der Schleife auf
Zitat:
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; |
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.
|
AW: Form hängt sich bei der Schleife auf
Zitat:
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:
berechnen und mit
mod
Delphi-Quellcode:
wegschreiben. Die Aktualiserung des Progressbars ist dabei nicht mehr sinnvoll.
WriteBuffer
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 10:02 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