100% CPU-Last



  • 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