Gui hängt sich auf (Visual C++)
-
Hallo,
ich möchte eine einfache Anzeige, einer Kurve realisieren. Ich lese über OPC daten einer Maschine ein und zeige den Verlauf Osziloskopartig an.
Das funktioniert ja auch ganz gut, aber wenn ich das Programm länger laufen lasse, hängt es sich auf.
Ich tippe auf einen Speicherüberlauf, oder??Folgende Funktion wird über den WN_TIMER all 100ms aufgerufen und zeichnet die Anzeige neu:
void Draw_With_Buffering() { //FillRect fills the buffer DC with the colour white SelectObject(biop->Get_DC_Buffer(0),background_brush); FillRect(biop->Get_DC_Buffer(0),&rect1,background_brush); // Gitter grau, gestrichelt zeichnen hAufnahmePen = CreatePen(PS_DASH, 1, RGB(150, 150, 150)); hPenOld = (HPEN)SelectObject(biop->Get_DC_Buffer(0), hAufnahmePen); // horizontal: for (i=1; i<4; i++){ MoveToEx(biop->Get_DC_Buffer(0), rect1.left, rect1.bottom -i*AbstandHoriz, NULL); LineTo(biop->Get_DC_Buffer(0), rect1.right, rect1.bottom -i*AbstandHoriz); } // vertikal: for (i=1; i<8;i++){ MoveToEx(biop->Get_DC_Buffer(0), static_cast<int>(rect1.left+i*AbstandVert+0.5), rect1.top, NULL); LineTo(biop->Get_DC_Buffer(0), static_cast<int>(rect1.left+i*AbstandVert+0.5), rect1.bottom); } //// Rahmen zeichnen: jetzt in Paint //// limit1-Kennlinie zeichnen: DeleteObject(hAufnahmePen); hAufnahmePen = CreatePen(PS_SOLID, 2, Limit1Color); SelectObject(biop->Get_DC_Buffer(0), hAufnahmePen); MoveToEx(biop->Get_DC_Buffer(0), rect1.left, rect1.bottom -Limit1 /SkallierungWerte, NULL); LineTo(biop->Get_DC_Buffer(0), rect1.right, rect1.bottom -Limit1 /SkallierungWerte); // limit2-Kennlinie zeichnen: DeleteObject(hAufnahmePen); hAufnahmePen = CreatePen(PS_SOLID, 2, Limit2Color); SelectObject(biop->Get_DC_Buffer(0), hAufnahmePen); MoveToEx(biop->Get_DC_Buffer(0), rect1.left, rect1.bottom -Limit2 /SkallierungWerte, NULL); LineTo(biop->Get_DC_Buffer(0), rect1.right, rect1.bottom -Limit2 /SkallierungWerte); // limit3-Kennlinie zeichnen: DeleteObject(hAufnahmePen); hAufnahmePen = CreatePen(PS_SOLID, 2, Limit3Color); SelectObject(biop->Get_DC_Buffer(0), hAufnahmePen); MoveToEx(biop->Get_DC_Buffer(0), rect1.left, rect1.bottom -Limit3 /SkallierungWerte, NULL); LineTo(biop->Get_DC_Buffer(0), rect1.right, rect1.bottom -Limit3 /SkallierungWerte); // Kurve zeichnen: DeleteObject(hAufnahmePen); hAufnahmePen = CreatePen(PS_SOLID, 2, KurveColor); hPenOld = (HPEN)SelectObject(biop->Get_DC_Buffer(0), hAufnahmePen); if (!ArrayVoll){ //wenn Array noch nicht voll MoveToEx(biop->Get_DC_Buffer(0), WerteFeld[1][0] +rect1.left, rect1.bottom -1 -WerteFeld[0][0]/SkallierungWerte, NULL); for (i=1;i<Durchgang;i++){ LineTo(biop->Get_DC_Buffer(0), WerteFeld[1][i] +rect1.left, rect1.bottom -WerteFeld[0][i]/SkallierungWerte); } } else { //wenn Array voll => Werte laufen durch MoveToEx(biop->Get_DC_Buffer(0), WerteFeld[1][0] +rect1.left, rect1.bottom -1 -WerteFeld[0][Durchgang]/SkallierungWerte, NULL); for (i=1; i<(MaxWert - Durchgang); i++){ LineTo(biop->Get_DC_Buffer(0), WerteFeld[1][i+1] +rect1.left, rect1.bottom -WerteFeld[0][Durchgang +i]/SkallierungWerte); }; for (i=0; i< (Durchgang-1); i++){ LineTo(biop->Get_DC_Buffer(0), WerteFeld[1][MaxWert- Durchgang +i] +rect1.left, rect1.bottom -WerteFeld[0][i]/SkallierungWerte); } } // screen, strictly speaking onto the device context (hDC) of the // main window SelectObject(biop->Get_DC_Buffer(0), hPenOld); biop->Copy_to_Screen(0); DeleteObject(hAufnahmePen); DeleteObject(hPenOld); //realease memory of the brushes DeleteObject(background_brush); }
Meine Vermutung ist, dass die Ursache in dieser Funktion sein muss, doch ich komm irgendwie nicht weiter. Das Ding bringt mich noch zur Verzweiflung!!
Wenn jemand weiß, woran es liegen kann, wäre ich echt für Tipps dankbar!!!!
D_Lar
-
Vermutlich hast Du ein GDI Leak...
Siehe dazu:
http://msdn.microsoft.com/en-us/magazine/cc188782.aspx
-
Danke Jochen,
ich hab mir mal das Tool runtergeladen, und werde versuchen damit den Fehler zu finden.
-
ach ist doch blöd, gerade will einfach nix laufen. Jetzt bekomm ich nicht mal den Code für dieses Tool auf Visual C++ 2010 zum laufen.
Kann das wirklich sein, dass in dem Quellcode Fehler sind? zumindest wird bei mir angezeigt:
..\Common\Hookapi.cpp(416): error C2065: 'i': nichtdeklarierter Bezeichner
..\Common\Hookapi.cpp(427): error C2065: 'i': nichtdeklarierter Bezeichner
..\Common\Hookapi.cpp(427): error C2228: Links von ".pProc" muss sich eine Klasse/Struktur/Union befinden.Woran kann das den liegen??
So langsam rauch mir echt der Kopf!!
-
Auf welche Zeilen in dem oberen Code beziehen sich denn die Fehlermeldungen?
Ansonsten:
Die beiden C2065-Fehler liegen vermutlich daran, daß du in den for()-Schleifen davon ausgehst, daß die Zählvariable irgendwo existiert - in der Funktion wurde sie nicht definiert.
Der C2228-Fehler hat vermutlich eine ähnliche Ursache - du hast irgendwo den Ausdruck "x.pProc" verwendet, ohn dem Compiler zu sagen, was sich hinter x verbirgt.
-
Sorry CStoll,
diese Fehlermeldung bezieht sich nicht auf meinen Code oben, sondern auf GDI-Leak-Tool, von welchem mir Jochen den Link zum Project-Download geschickt hat. Darum war ich etwas verzweifelt, dass ich nicht mal das Tool-Programm zum laufen bekommen, und im fertigen Source-Code rum-verbessern, ist doch wahrscheinlich nicht ganz Sin der Sache. Aber danke für deine Fehleranalyse.
Ich hab jetzt den GDIView von http://gdiview.pro.de/ benutzt, um die GDI-Tools anzuzeigen. Das ist jetzt vielleicht eine ziemlich dumme Frage, aber wie erkenne ich jetzt ein GDI-Leak?? Wenn ich sehe, dass immer wieder z.B ein neuer Brush generiert wird?
Gruß D_Lar