Seite 1 von 1

QT Dialoge aus DLLs in Nicht-QT-Anwendung

Verfasst: 13. März 2009 20:23
von hka
Hallo,

ich habe das folgende, etwas komplizierteres Problem mit QT:

Ich habe ein GUI Programm, das nicht mit QT entwickelt wurde, sondern z.B. mit wxWidgets. In dem Programm werden Komponenten als DLL
dazugeladen. Jede Komponente hat ein eigenes Dialog-Fenster, das
ich gerne öffnen und anzeigen möchte und das mit QT erstellt wurde.
Ich habe verstanden, dass ich in jeder Anwendung eine QApplication brauche, die ich natürlich in meinem Fall nicht habe.
Aus diesem Grund binde ich an meine wxWidget Anwendung ein DLL an, die die QApplication in einem eigenen Thread enthält. Über diese DLL werden alle Komponenten gesteuert, und die Anzeige der Dialoge funktioniert auch gut. Ein Problem tritt jedoch leider auf, wenn ich alle DLLs entlade. In diesem Fall werden die Fenster der Komponenten geschlossen, und auch die DLL mit der QApplication wird sauber entladen, nach kurzer Zeit jedoch stürzt die weiterlaufende wxWidget-Anwendung ab.
Der Callstack deutet daraufhin, dass es daran liegt, dass irgendwas von QT im event-loop verblieben ist, im wxWidget Fall kommt die Exception zum Beispiel aus der Funktion wxEvtHandler::ProcessEvent.
Dasselbe Vorgehen funktioniert übrigens OHNE Probleme, wenn ich eine Konsolenanwendung (ohne event-loop) verwende.

Meine Frage: Wie kann ich mein Vorhaben, QT in eine Nicht-Qt-WIN32 Anwendung einzubinden, so gestalten, dass diese Exception vermieden wird? Alles läuft gut, aber die DLL entladen darf ich offenbar nicht. Vielleicht muss man sich da irgendwie abmelden, bevor man es macht?
Ich habe irgendwo mal etwas von einer Funktion gelesen, die Qt genau zu dem Zweck anbietet, von win32 auf QT umzusteigen, kann mich aber nicht mehr genau erinnern...

Ich bin für jede Hilfe dankbar, viele Grüße,

HKA

Verfasst: 13. März 2009 20:40
von CLRS530
Ich kann mir jetzt nicht genau vorstellen, wie es bei deiner Anwendung aussieht. Aber du startest doch sicher sowas wie a.exec(). Hast du es mal mit dem beenden dieser eventloop versucht?
qApp->quit(); oder ähnliches.

Verfasst: 13. März 2009 20:54
von hka
Vielen Dank für die Antwort. Ja, das habe ich kurz unter dem Stichpunkt QApplication mit eigenem Thread abgehandelt. Ich rufe die exec() Funktion in einem eigenen Thread auf, der dann solange in exec() verharrt, bis das letzte Fenster zu ist. Bevor ich die DLL für QT entlade, stelle ich sicher, dass alle Fenster zu sind und die exec() Funktion auch nicht mehr blockiert. Ist ein expliziter Aufruf der quit-Funktion nötig? Das wird in keinem Beispiel gemacht, sondern es wird immer darauf gewartet, dass exec() zuende läuft,
und das passiert bei mir auch ganz sicher.

Verfasst: 13. März 2009 22:01
von CLRS530
Ok.
Ging auch nur darum dort sicherzugehen. Wenn ich vor solchen Problemen stehe (was nebenbei oft vorkommt... ;)) versuche ich immer jeglichen Schrott, auch wenn es von der Logik ehr daran nicht liegen sollte.
Du machst auf mich einen kompetenten Eindruck und so krasse Sachen habe ich selbst noch nicht gemacht, von daher kann ich dir wohl auch nicht viel weiterhelfen.