Überlastung



  • Hallo,

    Ich habe eine Dialog-Anwendung erstellt und mache die Programmfunktionen in einer anderen Klasse. Während der Ausführung der z.T. langen Funktionen ist mein Dialog "unbearbeitbar", d.h. es lassen sich keine Menüs öffnen und der Dialog kann nicht mehr geschlossen werden, bis die Funktion (der anderen Klasse) angebarbeitet wurde.

    Gibt es da irgendeinen Trick, wie man den Dialog als "erste Wahl" oder so stellen kann??

    Danke!!

    Gruss

    Big Red



  • Durch folgende Methode oder Funktion:

    void XXX::DoPeekMessage (void)
    {
      MSG msg;
      while (PeekMessage (&msg, 0, 0, 0, PM_REMOVE))
      {
        TranslateMessage (&msg);
        DispatchMessage (&msg);
      }
    }
    

    Die Funktion muss aus innerhalb der Funktionen an geeigneten Stellen (z. B. zu Beginn einer Schleife) aufgerufen werden. Die Botschaften werden dann an das Fenster weitergeleitet und bearbeitet und die Programmausführung solange unterbrochen.



  • Danke!

    Es kommt allerdings nicht darauf an, Ausgaben im Dialog zu machen, sondern dass einfach nur der Dialog so bearbeitbar bleibt, als ob im Hintergrund gerade keine aufwändige Funktion läuft...

    Wenn ich den Dialog minimiere, lässt er sich auch nicht mehr maximieren 😞



  • Stichwort: Thread.



  • und mach es niemals so wie Manfred es sagte. so funktioniert z.B. Tab nicht mehr. dafür müsste man die funktion noch erweitern.



  • In einer MFC-Anwendung kannst du Manfreds Lösung "retten", indem du statt TranslateMessage/DispatchMessage CWinApp::PumpMessage aufrufst.

    Mit einem separaten Thread bekommst du eine viel bessere Trennung zwischen dem "langen Task" und deinem User Interface hin, allerdings auch eine deutlich höhere Komplexität.



  • Tag! Danke für die Antworten. Ich verstehe irgendwie nur Bahnhof.

    Mein Programm ist schon fast fertig... und jetzt das 😞



  • Hallo,

    Ich habe es doch noch geschafft, einen Thread zu erstellen. Wie kann ich jedoch von dort wieder auf die Elemente vom Dialog zugreifen???

    Ich habe es schon versucht mit CDialogDlg dlg; ... und dann dlg.Trace("Hallo"); (Trace ist eine Funktion meines Dialogs)... doch fehlanzeige



  • Du kannst eine Klasse abgeleitet von CWinThread erstellen. Dieser Klasse übergibst du eine Zeiger auf deinen Dialog. In dieser Klasse kommen dann deine Funktionen. Steht in der FAQ.

    Bzw. such mal nach CWinThread


Anmelden zum Antworten