AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren

Threads mit Callback im Mainthread

Ein Thema von Eric Mauch 15 · begonnen am 25. Jun 2025 · letzter Beitrag vom 26. Jun 2025
 
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.519 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
 

 
Themen-Optionen Thema durchsuchen
Thema durchsuchen:

Erweiterte Suche
Ansicht

Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 15:51 Uhr.
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz