AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Form hängt sich bei der Schleife auf

Ein Thema von Back2Code · begonnen am 13. Feb 2013 · letzter Beitrag vom 14. Feb 2013
Antwort Antwort
Benutzerbild von Back2Code
Back2Code

Registriert seit: 6. Feb 2012
Ort: Deutschland
272 Beiträge
 
Delphi XE7 Professional
 
#1

Form hängt sich bei der Schleife auf

  Alt 13. Feb 2013, 12:04
Delphi-Version: XE2
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 ?
  Mit Zitat antworten Zitat
EWeiss
(Gast)

n/a Beiträge
 
#2

AW: Form hängt sich bei der Schleife auf

  Alt 13. Feb 2013, 12:18
Ein

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
  Mit Zitat antworten Zitat
Benutzerbild von Back2Code
Back2Code

Registriert seit: 6. Feb 2012
Ort: Deutschland
272 Beiträge
 
Delphi XE7 Professional
 
#3

AW: Form hängt sich bei der Schleife auf

  Alt 13. Feb 2013, 13:08
Funktioniert. Dankeschön für die Hilfe. Kann gecloseed werden.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#4

AW: Form hängt sich bei der Schleife auf

  Alt 13. Feb 2013, 18:27
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.
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

AW: Form hängt sich bei der Schleife auf

  Alt 13. Feb 2013, 21:04
Threads wären hier wohl angebracht.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von Back2Code
Back2Code

Registriert seit: 6. Feb 2012
Ort: Deutschland
272 Beiträge
 
Delphi XE7 Professional
 
#6

AW: Form hängt sich bei der Schleife auf

  Alt 14. Feb 2013, 08:29
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;
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie
(Moderator)

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#7

AW: Form hängt sich bei der Schleife auf

  Alt 14. Feb 2013, 10:26
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Benutzerbild von sx2008
sx2008

Registriert seit: 16. Feb 2008
Ort: Baden-Württemberg
2.332 Beiträge
 
Delphi 2007 Professional
 
#8

AW: Form hängt sich bei der Schleife auf

  Alt 14. Feb 2013, 11:27
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 mod berechnen und mit WriteBuffer wegschreiben. Die Aktualiserung des Progressbars ist dabei nicht mehr sinnvoll.
  Mit Zitat antworten Zitat
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 16:29 Uhr.
Powered by vBulletin® Copyright ©2000 - 2020, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2020 by Daniel R. Wolf