100% CPU-Last



  • Auf die Gefahr hin, das ich mich bei der Suche zu doof angestellt habe:

    Ich habe eine Dialog-Applikation, die auch Tab-Ctrls beinhaltet. Das das Programm, wenn ich nichts mache auf Eingaben wartet, ist mir verständlich, dass das allerdings 100% der CPU in Anspruch nimmt, weniger. Wie bekomme ich denn raus, was ich ändern muss (oder besser wo ich es ändern muss), damit mein Programm bei "Nichtbenutzung" fast keine CPU verbraucht? Irgendwo ist da doch busy-waiting im Spiel...

    zwette



  • Lass mich raten: Entweder Sleep oder Endlosschleife im Spiel.



  • Weder noch, ich habe mein Programm komplett "event-driven" geschrieben. Also wenn Sleep oder so, dann schon vom MFC-Grundgerüst her, aber ich selbst habe nichts dergleichen programmiert. Es passiert ja nur was, wenn man auf irgendwas klickt...

    zwette



  • Zu dem Tab Control: Bei der Erzeugung müsst Ihr auf alle Fälle darauf achten, daß Ihr WS_EX_CONTROLPARENT den Child-Dialogen hinzufügt.



  • Heißt das, ich muss:

    CDialog* m_tabellenSeite[6];
    m_tabellenSeite[0]->Create(IDD_TRL, this);
    

    durch CreateEx mit Parameter WS_EX_CONTROLPARENT ersetzen, da sind aber n Haufen neuer Variablen drin, die ich nicht deuten kann, ich habe die TabCtrl-Klasse auch nicht geschrieben, ist aus nem Forum übernommen. Erbitte höflichst Hilfe beim "Füllen" der Parameter.

    zwette



  • hallo zwette

    lad dein projekt, wenn möglich, mal auf deinen webspace drauf.

    dann können wir dir wahrscheinlich helfen.



  • OK, hier kann man es runterladen (586 KB):

    http://www.zwette.de/temp/TMLA_test.zip

    Es ist unter Visual Studio 6 entwickelt worden, allerdings jetzt in VS7 importiert und weiterbearbeitet.

    zwette



  • die hohe cpu auslastung ist ja nur auf seite 1. da wird sich der fehler ja wohl ziemlich schnell finden lassen.



  • ...und auf der letzten auch...!!?? 😕



  • Kann es sein, das er hier nicht mehr rauskommt??

    for(int nZaehler = 1; nZaehler < m_Seitennummern; nZaehler++)
    {
        m_tabellenSeite[nZaehler] -> SetWindowPos(&wndTop, nX, nY, nXz, nYz, SWP_HIDEWINDOW);
    }
    

    Ist die SetRec-Methode in der TabCtrl-Klasse.

    zwette



  • was du brauchst ist ein Profiler - mit dem man die Stellen findet, wo es sehr langsam wird.

    Wenn jemand einen für MSVC++ (.NET) kennt
    bitte mailen.



  • Meinst du sowas wie VTune von Intel?

    zwette

    PS: HAB EINEN! http://www.codework.com/glowcode/product.html



  • Die OnPaint-Funktion hat sich als Schuldiger herausgestellt, aber wie bekomme ich das so hin, das er nicht dauernd nur zeichnet? Anscheinend hab ich keine korrekte Verknüpfung zwischen WM_PAINT und OnPaint!? Sie zeichnet nämlich permanent neu...

    zwette



  • Darf ich nochmal raten? Du benutzt nicht CPaintDC in OnPaint, sondern GetDC() o.ä. CPaintDC ruft im Destruktor ValidateRect auf. Da dies bei dir nicht geschieht bleibt der Bereich invalidated (*g*) und es wird ständig neu gezeichnet. Also, entweder:

    void CMyWnd::OnPaint()
    {
      CPaintDC dc(this);
      ...
    }
    

    oder:

    void CMyWnd::OnPaint()
    {
      ...
      ValidateRect(0);
    }
    

    EDIT: (Habs mir in deinem Projekt angeguckt. Ist so wie ich vermutet habe. Nimm die OnPaint-Funktionen raus wenn du sie nicht brauchst oder schreib "CPaintDC dc(this);" rein.)



  • noch ein hinweis: wenn man in deinem programm ESCAPE drückt, geht der aktuelle dialog zu. das ist bestimmt nicht so gewollt.



  • 🙂 schrieb:

    noch ein hinweis: wenn man in deinem programm ESCAPE drückt, geht der aktuelle dialog zu. das ist bestimmt nicht so gewollt.

    Woher willst du das wissen? 😉



  • @MaSTaH:

    Hey, THX, es funktioniert, im Grunde hattest du Recht, da ich aber einigen Quellcode (aus Sicherheitsgründen) unterschlagen hatte, konntest Du es nicht auf den Punkt bringen.

    Ich hatte zuerst:

    void CResonator_Single::OnPaint(void)
    {
        if (m_pGraph->GetDrawn() == true) // stellt fest, ob schon ein Graph gezeichnet wurde
        {
            CPaintDC dc(this);
            m_pGraph->DrawChart(m_pFileGraphS12, m_hWndGraphArea, S12_DATA);
        }
    }
    

    es muss natürlich lauten:

    void CResonator_Single::OnPaint(void)
    {
        CPaintDC dc(this);
        if (m_pGraph->GetDrawn() == true) // stellt fest, ob schon ein Graph gezeichnet wurde
        {
            m_pGraph->DrawChart(m_pFileGraphS12, m_hWndGraphArea, S12_DATA);
        }
    }
    

    Nochmal ein dickes DANKE SCHÖN!

    @:)
    Wie kann ich denn das unterbinden? Gibts etwas ne ESC-Message? Ist nicht gewollt (@MaSTaH )...

    zwette



  • Es müsste so gehen:

    BOOL CMyDlg::PreTranslateMessage(MSG* pMsg) 
    {
      if(pMsg->message == WM_KEYDOWN && pMsg->wParam == VK_ESCAPE)
        return TRUE;
    
      return CDialog::PreTranslateMessage(pMsg);
    }
    

Anmelden zum Antworten