AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Threads mit Callback im Mainthread

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

Registriert seit: 25. Jun 2025
6 Beiträge
 
#1

Threads mit Callback im Mainthread

  Alt 25. Jun 2025, 17:20
Hallo Zusammen,

folgende Problematik.

Ich Arbeite mit einem Hintergrundthread der Daten zur Anzeige aufbereitet (TBitmaps). Sobald ein Bild erzeugt wurde wird es mit:

TThread.Queue(nil,
procedure
begin
FOnLoadPicture(FBitmap);
end
);

An den Mainthread "übertragen". Danach läuft der Thread weiter und bereitet das nächste Bild vor. Am Ende gibt sich der Thread dann selbst frei.

Da das FOnLoadPicture() ja in dem Thread definiert ist könnte es doch sein, dass der Thread freigegeben wird bevor diese Funktion im Mainthread gelaufen ist oder?
Dann wäre das FOnLoadPicture ja nicht mehr gültig. Oder verstehe ich das falsch?

Über jeden Tipp mit dem ich ein bisschen Licht ins Dunkle bekomme wäre ich sehr dankbar.
Liebe Grüße
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Threads mit Callback im Mainthread

  Alt 25. Jun 2025, 17:26
Den Delphi-Knopf hast du nicht gesehn? (den mit dem griechischen Helm)


Zitat:
Da das FOnLoadPicture() ja in dem Thread definiert ist könnte es doch sein, dass der Thread freigegeben wird bevor diese Funktion im Mainthread gelaufen ist oder?
Dann wäre das FOnLoadPicture ja nicht mehr gültig.
Ja genau. (und auch das FBitmap)


Die Variable wird ja zwischen Thread und Queue-Proc automatisch geshared,

aber das Objekt darin .... tja, da es kein Interface ist, sondern ein Objekt,
und wenn dann dieses Objekt weg ist oder zwischendrin verändert wurde,
oder gar "grade eben" im Thread zeitgleich wieder verändert wird,
dann bist du selbst daran Schuld, wenn es knallt.


Ordentlich absichern (CriticalSections oder so)
oder richtig synchronisieren, so dass wirklich immer nur Einer gleichzeitig.

Bei einem Synchronize würde der Thread warten, bis das Andere fertig ist.
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (25. Jun 2025 um 17:32 Uhr)
  Mit Zitat antworten Zitat
Eric Mauch 15

Registriert seit: 25. Jun 2025
6 Beiträge
 
#3

AW: Threads mit Callback im Mainthread

  Alt 25. Jun 2025, 17:32
Ja das macht Sinn. Ich meinte nur das FOnLoadPicture. Das ist wie folgt definiert:

TOnLoadPicture = procedure(Const aBitmap:TBitmap) of object;
FOnLoadPicture:TOnLoadPicture;
property OnLoadPicture:TOnLoadPicture read FOnLoadPicture write FOnLoadPicture;

Wenn der Thread freigegeben wird ist ja auch das FOnLoadPicture weg oder nicht?

P.S.: Hatte den Helm tatsächlich nicht gesehen
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.468 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
Benutzerbild von himitsu
himitsu

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

AW: Threads mit Callback im Mainthread

  Alt 25. Jun 2025, 18:22
PS: Darum auch aufpassen, dass man sowas nicht in einer Schleife nutzt, sondern dann nochmal in einer Methode mit Parametern kapselt,
da das geheime Variableninterface dann ja von außen immer wieder überschrieben wird, also auch innerhalb der mehreren Anonymen sich der Inahlt ändern würde.

Delphi-Quellcode:
procedure TForm1.Button1Click(Sender: TObject);
var
  X: Integer;
begin
  for var i := 1 to 3 do begin
    X := Random(100);
    TThread.ForceQueue(nil, procedure
      begin
        ShowMessage(X.ToString); // alle zeigen den gleichen "letzten" Zufallswert
      end);
  end;
end;
Ein Therapeut entspricht 1024 Gigapeut.

Geändert von himitsu (25. Jun 2025 um 18:24 Uhr)
  Mit Zitat antworten Zitat
Eric Mauch 15

Registriert seit: 25. Jun 2025
6 Beiträge
 
#6

AW: Threads mit Callback im Mainthread

  Alt 25. Jun 2025, 19:55
Also meinst du ich soll am Besten alles was ich noch brauche in eine Temp-Variable speichern?
Irgendwie habe ich trotzdem ein ungutes Gefühl, dass irgendwas schief gehen könnte ...
  Mit Zitat antworten Zitat
Antwort Antwort

 

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 11:22 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