GUI träge durch hohe CPU Last ausgelöst durch ein Button Event - wie vermeiden?



  • Hallo allerseits!

    Ich arbeite an einem Dialog-basiertem MFC Projekt, das dazu dienen soll, das Ergebnis einiger Rechnungen in 3D zu visualisieren.

    Dazu ging ich grob gesagt wie folgt vor:
    Im Dialog kann man einige Parameter einstellen und durch Betätigung eines Buttons im Dialog wird das 3D Fenster geöffnet:
    (auf das hier wesentliche reduziert:)

    void CmfctestDlg::button1()
    {
       ...
       HWND hWnd = CreateWindow( ...);
       ...
       ::ShowWindow( hWnd, SW_SHOWDEFAULT );
       ::UpdateWindow( hWnd );
       ...
       while( msg.message!=WM_QUIT )
       {
          if( PeekMessage( &msg, NULL, 0U, 0U, PM_REMOVE ) )
          {
              TranslateMessage( &msg );
              DispatchMessage( &msg );
           }
       //lauter CPU lastige Sachen..
       ...
       Render();
       //Ende der while Schleife
       }
    }
    

    Also im Klartext: Diese while Schleife wird nie verlassen, solange dieses Fenster zur 3D-Darstellung geöffnet ist.

    Eigentlich wundert es mich daher, dass der GUI-Dialog überhaupt reagiert, erfreulicherweise tut er das aber. (Wie eigentlich? Die Anwendung müßte doch in der while Schleife des Button-Events "gefangen" sein, oder?)
    Allerdings reagiert die GUI nur recht träge.

    Daher meine Frage:
    Gibt es eine Möglichkeit, die GUI trotz CPU aufwendiger Rechnerei etwas besser reagieren zu lassen?

    (Andere Anwendungen reagieren während dessen ja schließlich auch noch, es ist also nicht so, dass die ganze CPU-Leistung restlos vereinnahmt ist.)

    Zum Beispiel eine Art Priorität für verschiedene Button-Events?

    Oder ist meine bisherige Architektur dafür einfach schlecht geeignet?
    (Alternativen wären ja z.B. ein nicht-modaler Dialog, in dem dann die 3D Ausgabe erfolgt oder eine MDI Anwendung. Ich weiß zwar noch nicht, wie das gehen könnte, aber wenn dann Hoffnung auf Lösung dieses Problems besteht, würde ich es mal probieren...)

    Danke und Gruß!



  • Also für bestimmte oder unendlich lange Berechnungen benutzt man eigentlich einen separaten Thread. Ein Thread ist sozusagen ein weiterer Prozess, nur innerhalb deiner eigenen Anwendung.


  • Administrator

    Wie es Artchi schon sagte, kann man sowas mit Threads realisieren. Für dich wäre wohl hier am besten ein Workerthread geeignet. Schau mal in deiner MSDN nach oder hier:
    http://msdn2.microsoft.com/en-us/library/975t8ks0.aspx

    Wieso gewisse Dinge immer noch funktionieren ist wohl auf deine Nachrichtenbehandlung in der While-Schleife zurückzuführen. Die behandelt auch normale Nachrichten von den Fenstern und solches Zeug. Somit wird immer eine Nachricht ausgeführt nach jedem Durchgang der Berechnung. Das ist allerdings auch wieder schlecht, wenn du z.b. auf dein WM_QUIT reagieren möchtest, denn wenn es zuviele Nachrichten hintereinander hat, führt das wenn man so will zu einem Stau und bis deine WM_QUIT Nachricht an Ort und Stelle ist, ist vielleicht schon sehr viel Zeit vergangen. Zudem reagierst du auf die WM_QUIT Nachricht erst nach einem weiteren Durchlauf. Das ist auch ein wenig fraglich, ob dies sinnvoll ist.

    Aber schau dir mal die Threads an. Gibt auch eine menge zu lesen auf www.codeguru.com und auch anderswo, einfach mal Google benutzen. Und wenn dann immer noch Probs hast, hast ja noch das Forum ^^

    Grüssli





  • Danke schön für die zahlreichen Antworten und Entschuldigung für meine späte Antwort, ich hatte mich auf die automatische Benachrichtigung verlassen, die mich aber heute im Stich gelassen hat und somit sah ich die Antworten jetzt erst...

    beste Grüße!



  • Danke an alle, klappte einwandfrei! 😃


Anmelden zum Antworten