Dialogsteuerung innerhalb Threads unmöglich



  • Hallo!

    Langsam komm ich mir doof vor so viele Fargen zu stellen in so kurzer Zeit. Wie gesagt, ich habe zwei Threads, die gerufen werden und deren Ergebniss ausgewertet wird.
    Ich habe es nun geschafft auf das Ende der Threads zu warten, somit läuft die Applikation insgesamt recht gut.
    Nun werden in den Threads jeweils modale Dialoge aufgerufen bzw. ausgeführt.
    In der Basisklasse der Applikation ist das kein Problem, aber wenn ich diese Threads aus einem bestehenden modalen Dialog rufe geht es nicht mehr, der erste Thread läuft los und wo er in seiner

    Run()
    

    einen Dialog mit

    DoModal()
    

    ruft, bleibt das Proggy stehen.

    Ich habe in die DoModal() mit dem Debugger zur Laufzeit geschaut und bemerkt, dass er, innerhalb eines Dialogs gerufen, den Thread Dialog gar nicht starten kann, denn da stehen folgende Zeilen:

    // disable parent (before creating dialog)
    HWND hWndParent = PreModal();
    AfxUnhookWindowCreate();
    BOOL bEnableParent = FALSE;
    if (hWndParent && hWndParent != ::GetDesktopWindow() && ::IsWindowEnabled(hWndParent))
    {
    	::EnableWindow(hWndParent, FALSE);
    	bEnableParent = TRUE;
    }
    

    Da bleibt er einfach stehen, versucht es also, geht aber nicht, da dem Thread bzw. dem Dialog im Thread der Parent ja nicht bekannt ist, da es den in dem Sinne nicht gibt, da er ja indirekt gerufen wurde mit Zwischenstation Thread.

    Danke, Ranger



  • Dann übergib doch Deiner "Zwischenstation" eine Referenz auf den eigentlichen Parent! Es wäre dann zu überlegen, dass Du dafür auch die PreModal() überschreiben musst, damit sie dir diese Referenz dann liefert.
    Oder leite deine "Zwischenstation" von CDialog ab, wobei ich mir nicht sicher bin, ob das ohne weiteres geht.



  • DrOetker hat recht. Du kannst jedem Thread beim Erstellen einen Parameter Deiner Wahl übergeben, z.B. Deinen DialogParent. Ob MFC das irgendwie verhindert, dass ein Dialog nicht über einen Thread aufgerufen werden kann, kann ich mir eigentlich nicht vorstellen, weiß es aber nicht genau.
    Als Alternative könntest Du aus Deinen Threads eine Nachricht an Deinen Hauptdialog schicken, dass die modalen Dialoge angezeigt werden sollen. Die Dialoge werden dann de facto in der Nachrichtenbehandlungsroutine dieser Nachricht erstellt und nicht aus dem Thread heraus.



  • Hallo Cosmixx!

    Ich denke Deine letzte Idee ist gar nicht so schlecht. Allerdings habe ich dann wieder das Problem, dass ich nicht die beiden Dialoge der zwei threads nebeneinander laufen lassen kann, weil in den beiden Threads jeweils ein Dialog gerufen wird.
    In den MeldungsHandlers hab ich dann wieder nur die Chance, dass einer läuft. Nichtmodale Dialoge hab ich auch schon versucht, hatte auch keinen richtigen Erfolg.
    Dieser Part wäre aber noch zu testen.

    Danke, Ranger


Anmelden zum Antworten