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
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% TThread.Synchronize()
ist die einfachste Lösung:
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:
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%Tags und Links thread-safety delphi forms synchronization