Registriert seit: 10. Jun 2003
Ort: Berlin
9.648 Beiträge
Delphi 11 Alexandria
|
AW: Einbinden eines Thread Downloads
21. Jul 2024, 22:21
Danke jaenicke, aber so einfach ist es nicht.
Doch, wäre es, wenn du nicht selbst noch etwas dazu schreiben würdest. Das Beispiel war vollständig. Ich hatte nur den Inhalt der Prozedur weggelassen, weil der oben eh schon stand. Komplett sieht es dementsprechend so aus:
Delphi-Quellcode:
unit SyncThreadedDownload;
interface
uses
System.RTLConsts, System.SysUtils, System.Classes, System.Net.HttpClient, System.Net.URLClient;
type
TDownloadCompleteEvent = reference to procedure( const URL: String; Stream: TStream; Error: Exception);
procedure ThreadedDownloadFile( const URL: String; OnDownloadComplete: TDownloadCompleteEvent);
implementation
procedure ThreadedDownloadFile( const URL: String; OnDownloadComplete: TDownloadCompleteEvent);
begin
if ( URL = ' ') or not Assigned(OnDownloadComplete) then
raise EArgumentException.CreateRes(@SArgumentNil);
TThread.CreateAnonymousThread(
procedure
var
HTTP: THTTPClient;
Stream: TMemorystream;
Success: Boolean;
DError: Exception;
begin
TThread.NameThreadForDebugging(' ThreadedDownloadFile');
DError := nil;
HTTP := THTTPClient.Create;
Stream := TMemoryStream.Create;
try
HTTP.CustomHeaders[' Pragma'] := ' no-cache';
try
HTTP.Get( URL, Stream);
{TThread.Synchronize(nil,
procedure
begin
OnDownloadComplete(URL, Stream, nil);
end);}
except
{on E: Exception do begin
TempErr := E; // durch einen Bug muß es kopiert werden, auch wenn der Compiler sich bei OnDownloadComplete(URL, nil, E); nicht beschwert ... E ist im Sync leider NIL
TThread.Synchronize(nil,
procedure
begin
//OnDownloadComplete(URL, nil, E); // siehe Bugreport im alten QualityPotal
OnDownloadComplete(URL, nil, TempErr);
end);
end;}
FreeAndNil(Stream); // für das if-Assigned im OnDownloadComplete ... oder einfach lassen, auch wenn es eh nichts sinnvolles enthält, und nur auf Assigned(Error) prüfen
DError := AcquireExceptionObject as Exception;
end;
TThread.Synchronize( nil,
procedure
begin
OnDownloadComplete( URL, Stream, DError);
end);
finally
DError.Free;
Stream.Free;
HTTP.Free;
end;
end).Start;
end;
end.
Wenn du es als Klasse nutzen möchtest, kannst du das natürlich tun (finde ich auch besser), aber dann brauchst du eine Klassenmethode:
Delphi-Quellcode:
unit SyncThreadedDownload;
interface
uses
System.RTLConsts, System.SysUtils, System.Classes, System.Net.HttpClient, System.Net.URLClient;
type
TFileDownloader = class
private
type
TDownloadCompleteEvent = reference to procedure( const URL: String; Stream: TStream; Error: Exception);
public
class procedure ThreadedDownloadFile( const URL: String; OnDownloadComplete: TDownloadCompleteEvent);
end;
implementation
class procedure TFileDownloader.ThreadedDownloadFile( const URL: String; OnDownloadComplete: TDownloadCompleteEvent);
begin
if ( URL = ' ') or not Assigned(OnDownloadComplete) then
raise EArgumentException.CreateRes(@SArgumentNil);
TThread.CreateAnonymousThread(
procedure
var
HTTP: THTTPClient;
Stream: TMemorystream;
Success: Boolean;
DError: Exception;
begin
TThread.NameThreadForDebugging(' ThreadedDownloadFile');
DError := nil;
HTTP := THTTPClient.Create;
Stream := TMemoryStream.Create;
try
HTTP.CustomHeaders[' Pragma'] := ' no-cache';
try
HTTP.Get( URL, Stream);
{TThread.Synchronize(nil,
procedure
begin
OnDownloadComplete(URL, Stream, nil);
end);}
except
{on E: Exception do begin
TempErr := E; // durch einen Bug muß es kopiert werden, auch wenn der Compiler sich bei OnDownloadComplete(URL, nil, E); nicht beschwert ... E ist im Sync leider NIL
TThread.Synchronize(nil,
procedure
begin
//OnDownloadComplete(URL, nil, E); // siehe Bugreport im alten QualityPotal
OnDownloadComplete(URL, nil, TempErr);
end);
end;}
FreeAndNil(Stream); // für das if-Assigned im OnDownloadComplete ... oder einfach lassen, auch wenn es eh nichts sinnvolles enthält, und nur auf Assigned(Error) prüfen
DError := AcquireExceptionObject as Exception;
end;
TThread.Synchronize( nil,
procedure
begin
OnDownloadComplete( URL, Stream, DError);
end);
finally
DError.Free;
Stream.Free;
HTTP.Free;
end;
end).Start;
end;
end.
Wie kann ich hier abfragen, ob eine Exception vorliegt?
Das stand oben im Quelltext als Kommentar drin:
Zitat:
if not Assigned(Error) then
|