Einzelnen Beitrag anzeigen

Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#6

AW: Problem: Mehrere Threads auf ein Dictionary

  Alt 11. Mai 2015, 16:20
Warum solltest du den Task nicht abbrechen können? Du solltest den auf jeden Fall abbrechen und den gesamten Ablauf etwas anders aufbauen:
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
    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;
    
    // Synchronisierter Zugriff
    TThread.Synchronize( nil, procedure
      begin
        if Assigned(FOnUpdate) then FOnUpdate(self);
      end );
  end);
  FEs.Start;
end;
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)

Geändert von Sir Rufo (11. Mai 2015 um 17:13 Uhr)
  Mit Zitat antworten Zitat