Wie einsetzen?
Einfach meinen Code über deinen kopieren, fertig!
Wenn FOnUpdate immer aufgerufen werden soll muss, dann einfach so:
Delphi-Quellcode:
procedure TTeItemInfo.AddSmallDataFromListAsync(list: TList<TeItemDB.TTeItemDBData>; lang: TTeLanguage);
var
LList : TArray<TeItemDB.TTeItemDBData>;
LIdx : Integer;
begin
// Wenn es einen Task gibt
if Assigned( FEs )
then
// dann brechen wir den mal ab
FEs.Cancel;
// Wir prüfen schon vorher, welche Items abgearbeitet werden müssen
for LIdx := 0
to list.Count - 1
do
if not smalldata.ContainsKey(list[LIdx].id)
then
LList := LList + [ list[LIdx] ];
FEs := TTask.Create(
procedure()
var
i: Integer;
s:
String;
begin
try
for i := Low( LList )
to High( LList )
do
begin
// Prüfen ob dieser Task abgebrochen wurde
TTask.CurrentTask.CheckCanceled;
// wirft eine Exception, wenn abgebrochen
s := DownloadInfo(LList[i].id, lang.LoadedLanguage);
TThread.Synchronize(
nil,
procedure
begin
// wir müssen nochmal prüfen,
// denn es könnten parallel Einträge hinzugekommen sein
if not smalldata.ContainsKey(LList[i].id)
then
AddSmallInfo(s,list[i].id,lang);
end );
end;
finally
// Synchronisierter Zugriff
TThread.Synchronize(
nil,
procedure
begin
if Assigned(FOnUpdate)
then FOnUpdate(self);
end );
end;
end);
FEs.Start;
end;
Nein, die
Exception brauchst du nicht fangen (nur wenn du möchtest) und es wird dir auch nicht um die Ohren gehauen, da die
Exception im Thread aufschlägt und diese nicht an den Haupt-Thread weitergereicht wird (das müsste man dann selber regeln, wenn erwünscht).
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ea 0a 4c 14 0d b6 3a a4 c1 c5 b9
dc 90 9d f0 e9 de 13 da 60)