Einzelnen Beitrag anzeigen

HintByError

Registriert seit: 13. Dez 2018
Ort: Marburg
21 Beiträge
 
Delphi XE2 Professional
 
#4

AW: Das Chrome-Embedded-Framework und die Synchronisierung ohne TThread.Symchronize.

  Alt 7. Jun 2022, 12:32
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;
Wolfgang Sauer
  Mit Zitat antworten Zitat