Hi wicht,
danke für die schnelle Antwort
Zitat von
wicht:
Muss man denn das Form der
DLL in einem eigenen Thread erstellen? Ich meine sowas auch mal gemacht zu haben, da konnte ich ganz normal in der der
DLL das Fenster anzeigen (kann sein, dass es Modal war, aber tut das was zur Sache?). Und wenn das gehen sollte, wäre das ja ein Zeichen dafür, dass die Forms-
Unit sich um einen MessageLoop in eigenem Thread kümmert und du könntest Synchronize eventuell verwenden?
Ja, das sind nur modale Sachen, da wird natürlich zum Glück nichts an
VCL über die Boundaries geschoben.
Jetzt ist es so: Workerthreads arbeiten und erstellen & zeigen Modales Fenster wenn nötig (das dann synchronisiert).
Zitat von
wicht:
Mit WaitFor und Terminate habe ich auch schon tolle Erfahrungen gesammelt. Hilft dir vielleicht die OnThreadTerminated-Property? Ich habe meinen Kram auf FreeOnTerminate := True, mache in dem Ereignis die abschließenden Arbeiten und der Thread gibt sich dann selbst Frei. An anderer Stelle setze ich am Ende von Execute ein Event auf welches ich warte, ist denke ich auch nicht verkehrt (hast du ja schon selbst vorgeschlagen).
Vielleicht hilft das irgendwie minimal weiter...
Auf jeden Fall, das Event am Ende von Execute war genau meine Idee - von daher ist das ja schonmal eine Bestätigung.
Edit:
VCL in
DLL hat ja eigenen Scope, also sollte das kein Problem sein. Das die
VCL nicht thread-safe ist, bedeutet für eine autarke
DLL nicht, das diese nicht in einem Thread ausgeführt werden kann. Nur die Grenzen sind wichtig, das Synchronize geht naütrlich nicht, da es ohne Applikation kein positives Resultat für CheckSynchronize gibt, mangels MessageQueue.
Mal gucken, was mir da noch einfällt...
Edit2: Gelöst, für das Terminate geht natürlich das Event, für das Synchronize den guten alten Fix von Peter Below (TeamB, so wie unser Remy vom
Indy Team). Link:
http://cc.embarcadero.com/Item.aspx?id=21148. Der D6DLLSynchronizer macht nichts anderes, als der
DLL eine globale MessageQueue zu geben, was CheckSynchronize im Thread und damit Synchronize() wieder funktionieren lässt.
Darauf hätt ich kommen können... Trotzdem vielen Dank
Gruß,
Assertor