Hallo,
ich hatte das Problem vor Urzeiten in einem Projekt auch, doch es hakelt dann auch an weiteren Ecken. So habe ich in DLLs eigene Threads laufen und es kam dazu, dann auch das "OnTerminate"-Event nicht ausgeführt wird, da dieses auch über einen Synchronize-Meschanismus ausgelöst wird.
Ich habe dann auch Notgedrungen Am Ende des Threads eine Message per SendeMessage ans Fenster geschickt, was dann funktioniert und damit war ein spezielles OnTerminate machbar.
Ganz genau habe ich nicht herausbekommen welche Lösung welches Teilproblem entspannt hat, da ich einiges ausprobiert habe, aber hier mal ein paar Hinweise... vielleicht hilfts ja bei Problemen mit Threads/Fenstern in DLLs auch [ich benutze Delphi 7]:
* Wird die Forms-
Unit in der
DLL benutzt (z.B. weil ein Fenster erzeugt wird) so sollte das
Handle-Property von "Application" beim Start mit dem
Handle des Hauptmoduls (exe) beschrieben werden. So bilden die Fenster innerhalb der
DLL und das Fenster des Hauptprogrammes ein zusammenhängende Application. Mir schien auch das o.a. Problem damit erledigt zu sein.
* Die globale Funktion "WakeSynchronize" wird bei Events wie Synchronize() oder beim Starten des OnTerminate aufgerufen, aber dies gelangt offenbar nicht zur "richtigen"
VCL durch. Ich habe daher der Funktion eine eigene zugewiesen, die meinem Fenster per Postmessage einen Hinweis schickt. Kommt diese Message im Fenster an führe ich "while CheckSynchronize do;" aus. Aus unerfindlichen Gründen muss diese Zeile doppelt ausgeführt werden, sonst wird manchmal (!) ein Aufruf ausgelassen.
Durch den Aufruf von CheckSynchronize() werden wartende Synchronize bzw. OnTerminate-Aufrufe ausgeführt.
Naja, vielleicht hilfts ja weiter. Ich hab daran damals recht lange gehangen...
/\/\arcus