DrawText wird immer langsamer
-
Hallo,
ich hab da wieder ein Problem.
Eine MFC-MDI Anwendung. Ich lese von einer Datei Datensätze ein und speichere sie in einem Feld. Über eine Toolbox steuere ich die Anzeige des jeweiligen Datensatzes (Feldnummer). Die Ausgabe in der View (OnDraw) läuft über LineTo, TextOut und DrawText.
Nun klicke ich so schöm durch die Datensätze und das Bild baut sich immer langsamer auf! Es liegt an den DrawText befehlen. Bei den ersten 3 Datensätzen gehts noch "Blitzschnell", dann dauerts kurz(4...5.Datensatz) und dann muss man schon einige Secunden warten bis sich das Bild aufbaut, wobei man die einzelnen Schritte sehen kann. Klicke ich dann wieder runter geht der Bildaufbau wieder schneller von statten.
So ein Fehler kann man nach solch einer Beschreibung sicher schlecht lokalisieren aber vieleicht hat ja jemand eine Idee, was es sein könnte. Wieso braucht DrawText bei den Datensätzen höherer Zahl so viel CPU-Rechenzeit? Die Datensätze sind alle ziemlich gleich.
Anbei noch ein Beispiel, wie ich die DrawText's geschrieben habe:CRect ProjectRect (LEFTBORDER2,LinesNumber(17),RIGHTBORDER2,LinesNumber(19)); help = pDoc->Z[ShownDS].Project; pDC->DrawText(help,ProjectRect,DT_LEFT|TA_TOP); //CPU braucht hier immer längerMicha
-
Zeig mal etwas mehr Code.
Kann es sein, dass Du GDI Leaks erzeugst?Wie steuerst Du, dass die Anzeige sich aktualisiert?
-
edit:
Also es lag wirklich an der intialisierung der char-variablen (hatte ich nicht gemacht, da es nicht richtig funzte)
So hat es dann funktioniert, wenn ich große char-Felder initieiere;for(i=0;i<LargeStrSize;i++)Z[n].Project[i]=32; //32=Leerzeichen Z[n].Project[LargeStrSize-1]='\0' ; //und den schluß nicht vergessenKomisch ist nur, das dann im programm im Rytmus von 3 abwechseln "0" und "32" drin steht.
ungefähr so:
a[1]=0
a[2]=0
a[3]=0
a[4]=32
a[5]=32
a[6]=32
a[7]=0
...
kann da mal jemand was zu sagen, wieso da nicht überall 32 drin steht? dieser Rytmus ist mir vorher schon aufgefallen.Micha
-
Wenn ich die char-Variablen in der o.g. Weise initialisiere kommt beim schließen des Programms folgende Fehlermeldung:
*Debug Error!HEAP CORRUPTION DETECTED: ...
CRT detected that the application wrote to memory after end of heap buffer.Memory allocated at ...\Mydoc.cpp(19)*
dort steht
IMPLEMENT_DYNCREATE(MyDoc, CDocument)Scheinbar muss ich die Variable noch im Destruktor zerstören. Ich dachte man muss dies nur tun, wenn ich die Variablen mit new erzeuge?
Was muss ich tun um diesen Fehler zu beheben?
-
Ich gehe eher davon aus, dass Du Speicher allokierst und über die Speichergrenzen hinaus in den Block schreibst.
Dieser Fehler hat mit fehlendem delete nichts zu tun!