Man bekommt die Sache mit „TThread.Synchronize(nil,showPnlDownloadFeature)“ zum laufen. Allerdings mit einer Einschränkung: der Aufruf von „Application.ProcessMessages;“ ist dann in „showPnlDownloadFeature“ nicht möglich. Die auf „TTimer“ basierende Lösung erlaubt also mehr Zugriffe.
Prinzipiell ist eine Parameterübergabe von lokalen Variablen der nebenläufigen Thread-Prozedur an den Haupt-Thread nicht möglich, sondern man muss globale Variablen auf dem Heap oder im Datensegment verwenden. Damit verschiedene Threads, die die gleiche Methode als Ereignis zur Folge haben, bei dem Zugriff auf die Parameterübergabe an den Haupt-Thread nicht kollidieren, ist eine Zugriffssperre mittels „Interlocked.Increment“ notwendig. Bei der „TTimer“-Variante ist dies mit mittels der Eigenschaft „Enabled“ der „TTimer“-Instanz gelöst.
Code für die Auslösung der Synchronisierung:
Delphi-Quellcode:
if not downloadInProgress and (downloadItem.FullPath <> '') then begin
try
repeat until (TInterLocked.Increment(lockcount)=1);
//Zugriffsmöglichkeit abwartem und sperren
latestDownload := copy(downloadItem.FullPath, 1,
Length(downloadItem.FullPath));
//Parameterübergabe mit globaler Variable an „showPnlDownloadFeature“
except //Fehlerbehandlung:
TInterLocked.Decrement(lockcount);
raise;
end;
TThread.Synchronize(nil,showPnlDownloadFeature);
//Synchronisieren mit dem Haupt-Thread, wenn kein Fehler.
end;
Anweisungen in „showPnlDownloadFeature“:
Delphi-Quellcode:
try
pnlDownloadFeature.Visible := true;
btnDownloadFeature.Caption := ExtractFileName(latestDownload) + ' laden';
//Visualisierung und Schaltfläche für Download zugänglich machen
// Application.ProcessMessages;//bei Synchronize nicht erlaubt
Chrome.SetFocus(true);
finally
TInterLocked.Decrement(lockcount);
//Sperre aufheben, da Parameter ab hier nicht mehr ausgewertet werden.
end;