Eine Message-Loop (die Abarbeitugsprozedur) hat nicht jeder Prozess
und andere Prozesse haben auch gern mal Mehrere davon.
Aber grundsätzlich kann jeder
Thread eine Message-Queue bekommen.
Diese wird automatisch erstellt, sobald die erste Message an den Thread gesendet wird, bzw. wenn die erste Komponente (Window) in dem Thread erstellt wird.
In Delphi hat "standardmäßig" nur der Hauptthread eine Message-Behandlung, welche durch die
VCL in der TApplication-Instanz behandelt wird (Application.Run, Application.ProcessMessages usw.),
aber es ist dennoch möglich auch in anderen Threads andere Messages zu behandeln.
Warum es manchmal hängen bleibt, vorallem gern beim Verschieben von Fenstern, auch bei der Konsole, ist halt eines der Mysterien.
Aber wenn der Thread nicht durch die
VCL hängen bleiben darf, dann mußt du halt dein Konzept verändern/anpassen.
Einige Lösungen:
- Der Thread übergibt nicht die Daten, sondern die GUI/Hauptthread holt sich die Daten ab. (eventuelles Hängenbleiben umgedreht)
- Man gibt die Daten asynchron an VCL/Thread weiter. (eigene Queue, Events, Pipes, Windows-Message senden, oder Sonstwas, und nicht auf die Behandlung warten ... PostMessage<>SendMessage)
- Beim Senden wird mit Timeout gearbeitet, damit es nicht zu lange hängt, und versucht es dann halt später nochmal.
- ...