Fädle offene Formulare in Delphi

8

Ich möchte neue Instanzen von Form (und zeige sie) von einem Thread erstellen. Aber es scheint, dass es meine Anwendung und meinen Thread einfriert (mein Thread wird zu einem Nicht-Synchronisations-Thread und friert meine Anwendung ein).

So (aber es macht nicht das, wonach ich suche)

%Vor%

Ich möchte nicht Classes.TThread.Synchronize method

verwenden     
user558126 15.03.2012, 12:30
quelle

2 Antworten

14

Sie können auf diese Weise keine notorisch thread-unsichere VCL-Form erstellen (beachte - es ist nicht nur Delphi - alle GUI-Entwicklung, die ich gesehen habe, hat diese Einschränkung). Verwenden Sie TThread.Synchronize, um dem Hauptthread zu signalisieren, dass das Formular erstellt wird, oder verwenden Sie einen anderen Signalisierungsmechanismus wie die PostMessage () - API.

Insgesamt ist es am besten, GUI-Inhalte aus sekundären Threads zu entfernen, so weit wie möglich. Sekundäre Threads werden besser für nicht GUI-I / O- und / oder CPU-intensive Operationen verwendet (insbesondere wenn sie aufgeteilt und parallel ausgeführt werden können).

PostMessage-Beispiel (das Formular enthält nur einen Speedbutton):

%Vor%     
Martin James 15.03.2012, 12:39
quelle
15

TThread.Synchronize() ist die einfachste Lösung:

%Vor%

Wenn Sie eine moderne Version von Delphi verwenden und nicht warten müssen, bis die TForm -Erstellung abgeschlossen ist, bevor Sie den Thread weiterlaufen lassen, können Sie stattdessen TThread.Queue() verwenden:

%Vor%

Update: Wenn Sie PostMessage() verwenden möchten, ist die sicherste Option, Ihre Nachrichten entweder im Fenster TApplication oder in einem dedizierten Fenster, das mit AllocateHWnd() erstellt wurde, zu veröffentlichen, zB:

%Vor%

.

%Vor%     
Remy Lebeau 15.03.2012 15:41
quelle