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