Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Synchronisierung mit MainThread ohne Thread-Kontext (https://www.delphipraxis.net/152591-synchronisierung-mit-mainthread-ohne-thread-kontext.html)

s.h.a.r.k 29. Jun 2010 00:24

Delphi-Version: 2010

Synchronisierung mit MainThread ohne Thread-Kontext
 
Und war interessiert mich, ob es möglich ist, mit dem MainThread zu synchronisieren, obwohl man sich nicht in einem TThread-Objekt befindet. TThread stellt ja automatisch die
Delphi-Quellcode:
Synchronize()
-Methode zur Verfügung. Aber selbst die statischen Klassenmethoden davon helfen mir nicht wirklich, da ich ja keine TThread-Instanz zur Verfügung habe.

Hintergrund des Ganzen ist, dass ich ein Handle im Kontext des MainThread erzeugen muss, um, darüber Nachrichten austauschen zu könnten. Mein Objekt will ich nicht von TThread ableiten, da es einfach unpassend ist. Zudem arbeitet diese Klasse als Singleton-Pattern mit Lazy Load, d.h. die einzige Instanz wird erst erzeugt, wenn diese auch zum ersten mal zum Einsatz kommt, d.h. im Klartext, dass auch ein Thread ungleich dem MainThread den Constructor aufrufen kann. Und genau hier liegt die Krux mit der Geschichte: im Constructor wird das Handle für die Klasse erzeugt.

Ich hoffe, dass die wichtigen Punkte klar rüber gekommen sind :mrgreen:

sirius 29. Jun 2010 08:02

AW: Synchronisierung mit MainThread ohne Thread-Kontext
 
funktioniert doch:
Delphi-Quellcode:
procedure TForm1.FormCreate(Sender: TObject);
var id:Cardinal;
begin
  BeginThread(nil,0,@TForm1.ThreadFunc,self,0,id);
end;

procedure TForm1.snyc;
begin
  if GetCurrentThreadId=system.MainThreadID then
    showmessage('yes');
end;

function TForm1.ThreadFunc: Integer;
begin
  TThread.Synchronize(nil,snyc);
end;

mleyen 29. Jun 2010 08:29

AW: Synchronisierung mit MainThread ohne Thread-Kontext
 
Die EnterMainThread/LeaveMainThread aus den AsyncCalls sollte eigentlich auch funktionieren.

s.h.a.r.k 29. Jun 2010 16:30

AW: Synchronisierung mit MainThread ohne Thread-Kontext
 
@sirius: Wie, wenn wenn nil übergebe, so funktioniert das auch?! Auf die Idee bin ich noch gar nicht gekommen.

// edit
Hm, irgendwie führt der Aufruf von
Delphi-Quellcode:
TThread.Synchronize(nil, ...)
zu einem Deadlock :gruebel: Was aber wie zu erwarten an meinem Programm lag :)

sirius 29. Jun 2010 16:58

AW: Synchronisierung mit MainThread ohne Thread-Kontext
 
De9in Deadlock liegt aber an etwas anderem.

s.h.a.r.k 29. Jun 2010 17:08

AW: Synchronisierung mit MainThread ohne Thread-Kontext
 
Siehe den Satz den ich noch dazu geschrieben habe. Der MainThread ist leider in den wartenden Zustand übergegangen -> CriticalSection.

Danke aber noch, hat wunderbar funktioniert.


Alle Zeitangaben in WEZ +1. Es ist jetzt 15:59 Uhr.

Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz