Einzelnen Beitrag anzeigen

blackdrake

Registriert seit: 21. Aug 2003
Ort: Bammental
618 Beiträge
 
Delphi 10.3 Rio
 
#15

Re: Programm abrupt beenden ohne Memory Leaks

  Alt 11. Sep 2007, 22:10
Hallo.

Bei DEC hat es mit abort; und dem Progress-Interface sehr gut funktioniert.

Aber bereits bei ZLib klappt es gar nicht:

Delphi-Quellcode:
procedure TForm1.zlib_progress(Sender: TObject; tag: Integer; Percent: Integer);
begin
  pbr_progress.position := Percent * pbr_progress.max div 100;
  application.processmessages;
  if application.Terminated then SysUtils.abort;
end;

procedure CompressFile(InputFileName, OutputFileName: string; Progress: TOnProgress);
var
  CompressInputStream: TStreamProgressAdapter; // TFileStream
  CompressOutputStream: TFileStream;
  CompressionStream: ZLib.TCompressionStream;
begin
  try

  CompressInputStream := TStreamProgressAdapter.Create(TFileStream.Create(InputFileName, fmOpenRead), 0);
  CompressInputStream.OnProgress := Progress;
  try
    CompressOutputStream := TFileStream.Create(OutputFileName, fmCreate);
    try
      CompressionStream := TCompressionStream.Create(clMax, CompressOutputStream);
      try
        CompressionStream.CopyFrom(CompressInputStream, CompressInputStream.Size);
      finally
        CompressionStream.Free;
      end;
    finally
      CompressOutputStream.Free;
    end;
  finally
    CompressInputStream.Free;
  end;

  except
    on E: Exception do
      if not (E is EAbort) then raise;
  end;
end;

begin
  CompressFile('...', '...', Form1.zlib_progress);
end.
Ich habe bereits versucht, den Adapter alternativ für CompressOutputStream oder CompressionStream zu verwenden. Bei CompressionStream gab es eine Stream-Operation-Exception. CompressInputStream müsste jedoch laut des Beispielprogrammes die korrekte Wahl sein. Wenn ich jetzt meine Anwendung schließe, scheint es einen Dead-Lock zu geben. Die Progressbar bewegt sich nicht mehr, aber die Methode CompressFile() wird nicht über die Exception verlassen, sondern bleibt aktiv.

Die Methode CompressFile() würde erst durch die EAbort-Exception verlassen werden, wenn ich direkt vor CompressionStream.CopyFrom ein "abort;" setzen würde. Irgendwie wird das Abort nicht weitergereicht.

Gruß
blackdrake
Daniel Marschall
  Mit Zitat antworten Zitat