[C/C++] Qt: moveToThread + GUI-Fenster nicht aus Main-Thread öffnen

Dieses Thema im Forum "Programmierung & Entwicklung" wurde erstellt von bloodyphoenix, 17. Mai 2011 .

Schlagworte:
Status des Themas:
Es sind keine weiteren Antworten möglich.
  1. 17. Mai 2011
    Qt: moveToThread + GUI-Fenster nicht aus Main-Thread öffnen

    Hey Leute,
    hab ne Frage zu Qt. Neue Fenster können in Qt, soweit ich gelesen hab nur vom Mainthread verwaltet werden, nicht aus Nebenthreads.

    Ich möchte gern ein TS3 Plugin schreiben, welches ein Fenster öffnen soll. Die Callbacks vom TS zum Plugin werden jedoch nicht im Main-Thread aufgerufen, sondern in einem anderen Thread und auf den Main-Thread hab ich einfach so direkt keinen Zugriff.
    Es gibt zwar die Möglichkeit ein Config-Fenster, bzw eine Funktion, die dieses öffnet vom MainThread aufrufen zu lassen, aber a) ist das umständlich dieses dann zu öffnen (ewig im Menu rumklicken) und b) wäre das doch zu einfach

    Nun bin ich eben zufällig über void QObject::moveToThread ( QThread * targetThread ) gestolpert.

    So wie ich das nun sehe, könnte ich das Widget-Objekt im Child-Thread erstellen, dieses Objekt auf den MainThread moven und danach Mithilfe eines Signals an den show()-Slot das Fenster von MainThread anzeigen lassen, da das Objekt dann ja die "thread affinity" zum MainThread hat.

    Verstehe ich das richtig, ist das so möglich, wie ich mir das vorstelle oder hab ich da etwas total verpeilt? Hab Qt atm noch nicht installiert, da ich noch am recherchieren bin, wie ich das am besten realisiere, da ich nicht wirklich die Erfahrung mit GUI in C++ hab.

    Vielleicht ist hier ja wer, der sich was mit Qt auskennt. Ich danke schonmal für jede Antwort.
     
  2. 17. Mai 2011
    AW: Qt: moveToThread + GUI-Fenster nicht aus Main-Thread öffnen

    Hi beschäftige mich in letzter Zeit auch mit Qt, vorallem weil das ansscheinend nun weiter Entwickelt wird, wird es wieder interessant.....

    Kannst du mir da eine Quelle nennen würde mir das auch gerne mal durchlesen.

    Also ich denke es liegt nicht daran das man Fenster nur aus dem Mainthread öfnnen kann sondern eher daran das nur im Main Thread der Eventhandler abgearbeitet wird und da TS woll nicht in QT entwickelt worden ist, wird es wohl da auch keinen Qt-Basierten Eventhandler geben.
    Am Rande noch gesagt: finde ich Qt für Plugins zu benutzen nicht so toll, da du ja die Qt-Bibliothek mit geben musst (DLLs), und die haben auch ein paar MB. (weiß jetzt nicht ob man diese irgentwie statisch linken kann)


    Nun da hättest du ja das Problemm das du den Mainthread ermitteln müsstest und wenn unter umständen mehrer Threads laufen wird das wieder schwirig.

    Mein Vorschlag wäre für dieses Problem, du bleibst in deinem eigenen Thread bzw. erstelslt ein zustätzlichen Thread und schaltest den Eventhandler ein, damit solltest du auch das Fenster anzeigen lassen können.
    PSeudo-Code:

    Referenz: Qt 5 | Documentation | Qt Project


    Mfg Rushh0ur
     
  3. 17. Mai 2011
    AW: Qt: moveToThread + GUI-Fenster nicht aus Main-Thread öffnen

    Kp, hab das in nem kommentar im ts-plugin gelesen und als ichs gegoogled hab, hab ich ähnliche antworten bekommen. hab jetzt aber keine konkrete quelle

    Doch doch, TS3 ist in Qt geschrieben. Die Qt-Libs sind auch direkt dabei, gerade deswegen liegt die wahl sehr nahe.

    Siehe von mir geposteten Link. Da ist sogar nen Beispiel um an den Main-Thread zu kommen.
    Code:
    myObject->moveToThread(QApplication::instance()->thread());
    Eben das geht nicht, soweit ich das gelesen hab. Du kannst einfach keine Fenster von anderen Threads zeichnen lassen, weils dann ne Exception gibt. Liegt wahrscheinlich an der Synchronisation, die man Aufgrund der Einschränkung vernachlässigen kann, bzw. die vernachlässigt wurde.
    BTW was meinst du mit eventhandler einschalten. Ich dachte das Slot/Signal-System ist quasi der Ersatz für nen Eventhandler-system. Und soweit ich das überflogen habe, braucht man dafür nix extra aktivieren?
     
  4. 17. Mai 2011
    AW: Qt: moveToThread + GUI-Fenster nicht aus Main-Thread öffnen

    Ahso, verwende zwar TS3,hab ich nicht wirklich mitbekommen das es in Qt geschrieben ist, dass sollte es dann natürlich erleichtern. ^^

    Es sollte laut der Beschreibung mit moveToThread teoretisch gehen, ich würd mal vorschlagen einfach ausprobieren.

    Richtig bei normalen Qt-Anwendungen ist dieser automatisch aktiviert bzw. der Code dafür wird automatisch generiert und sieht in etwa so aus:
    PHP:
    int main ( int argc char  * argv [])
    {
        
    QApplication app ( argc argv );
        
    MainWindow window ;
        
    window . show ();

        return 
    app . exec ();
    }
    Hinter QApplication wird wohl auch ein Thread-Objekt stecken und laut der Qt-Dokumentation wird mit dem Befehl exec die Event-Schleife und damit der Eventhandler gestartet, sprich solange diese nicht läuft werden signale/slots nicht abgearbeitet, das führt logischerweiße irgentwann zu einem Befehlsüberlauf und spätestens dann kommt die erste Exception.

    Wenn du nun manuel ein eigenen Thread startest dann ist dieser Eventhandler für diesen Thread abgeschaltet und wenn du in diesem dein Fenster erstellst und anzeigen möchtest wird dies nicht klappen solange die Event-Schleife nicht läuft, also müsste man nur diese "betreten". Leider habe ich noch nicht dieses Testen können, jedoch sollte es so teoretisch möglich sein ein Fenster auch in einem "Neben"-Thread an zu zeigen und zu verwalten.

    Mfg Rushh0ur
     
  5. 18. Mai 2011
    AW: Qt: moveToThread + GUI-Fenster nicht aus Main-Thread öffnen

    Aah, jetzt versteh ich was du meintest.

    Naja, wie du sagtest: "Einfach mal probieren". Genau das hab ich gemacht und nach ewigem Rumgefrickel mit VC++ muss ich sagen ich habs endlich hinbekommen.

    Offenbar werden die Callbacks im Plugin vom Main-Thread aufgerufen, denn es ist (selbst ohne moveToThread) ohne weiteres möglich nen Fenster zu öffnen.

    Damit hätte sich mein Problem auch erledigt und ich mach mal dicht.
     
  6. Video Script

    Videos zum Themenbereich

    * gefundene Videos auf YouTube, anhand der Überschrift.