Wenn du in einem Thread "UpdateStatus" aufrufst wird das hier im Hauptthread (durch das Synchronize) aufgerufen.
Delphi-Quellcode:
Threads[Index] := TURLCheckerThread.Create(UrlList, CriticalSection,
procedure(Msg: string)
begin
RichEditLog.Lines.Add(Msg); {Ergebnis als String}
RichEditLog.Lines.Add(ErgebnisListe.Text); {Ergebnis als StringList}
ErgebnisListe.Clear; {Nicht vergessen, sonst wird die StringList immer weiter befüllt}
end, @ShouldStop, ErgebnisListe);
Dabei greifst du auf die (globale) Variable "Ergebnisliste" zu. Wenn ein weiterer Thread aber gerade dabei ist in diese Ergebnisliste zu schreiben, kommt es zu Problemen.
Lösung: Auch dort die CriticalSection benutzen.
Des weiteren nutzt du 1 CriticalSection für 2 unterschiedliche Listen. Das funktioniert zwar, aber du sperrst immer 2 Listen, was das ganze verlangsamen kann.
Lösung: 2 CriticalSections oder TMonior.Enter(Liste) verwenden.