Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.470 Beiträge
 
Delphi 12 Athens
 
#4

AW: Threads mit Callback im Mainthread

  Alt 25. Jun 2025, 18:07
Alle Variablen/Parameter, welche von außen in die anonyme Methode (die Prozedur im Queue) rein gereicht werden,
werden als Kopie in einem "internen" Interface abgelegt, welches die übergeordnete Prozedur und die Anonyme sich teilen.

Ups ja, das betrifft doch nicht FOnLoadPicture.

In Wirklichkeit sieht es bei dir ja so aus.
Delphi-Quellcode:
TThread.Queue(nil,
  procedure
  begin
    Self.FOnLoadPicture({Self.?}FBitmap);
  end
);

Beispiel:
Delphi-Quellcode:
procedure TMiau.ABC(Param: Irgendwas);
var
  Blubb: Sonstwas;
begin

  Blubb := ...;
  TThread.Queue(nil,
    procedure
    begin
      Machwas(Param, Blubb);
      {Self.}FOnLoadPicture({Self.}FBitmap);
    end
  );
und intern sieht es dann eigentlich so aus, nach dem Kompilieren (so in etwa)
Delphi-Quellcode:
procedure TMiau.ABC(Param: Irgendwas);
type
  IGeheimesVariablenInterface = interface
    Self: TMiau;
    Blubb: Sonstwas;
    Param: Irgendwas;
  end;
  TGeheimesVariablenInterface = class(TInterfacedObject, IGeheimesVariablenInterface)
    ..
  end;
var
  XXX: IGeheimesVariablenInterface;
begin
  XXX := TGeheimesVariablenInterface.Create;
  XXX.Param := Param;

  XXX.Blubb := ...;
  TThread.Queue(nil,
    procedure
    var
      YYY: IGeheimesVariablenInterface := XXX;
    begin
      Machwas(XXX.Param, XXX.Blubb);
      XXX.Self.FOnLoadPicture(XXX.Self.FBitmap);
    end
  );
Also ja, wenn Self (dein Thread) weg ist, dann wäre auch FOnLoadPicture weg,
es sei denn du legst dir innerhalb deiner übergeordneten Prozedur eine lokale Variable an, wo dieser Wert gespeichert und der dann an die Queue übergeben wird. (entsprechend Blubb)

Wäre "Self" wiederum ein Interface, anstatt eines Objektes, dann sähe die Sache wieder etwas anders aus,
da die zusätzliche Referenz dessen Lebensdauer ja verlängern würde, bis die anonyme Methode beendet ist.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (25. Jun 2025 um 18:22 Uhr)
  Mit Zitat antworten Zitat