GDI lagger efter x sekunder

Tags:    c++

<< < 123 > >>
Hej.

Jeg har lavet et skrivekomponent magen til det i Visual Studio, hvor der er som bekendt en hel del grafiske elementer (linjeboksen, markeringsfunktionen, highlight af visse dele af teksten, etc.), men efter lidt tid eller et bestemt antal operationer (som at markere en linje frem og tilbage en masse gange hurtigt) giver GDI op.

Mit komponent ser således ud:
http://123login.dk/dexo/vse.png

Jeg kan desværre ikke vise, hvordan det ser ud, når GDI kokser, for da vil Windows ikke lade mig tage screenshots. Men jeg kan sige, at markeringen forsvinder og at der kommer en masse streger, der ligner komponentets caret (tekstmarkøren "IBeam"). Hvis jeg minimerer og gendanner vinduet, er komponentet helt sort (hvilket det er indstillet til at være ved programstart-up, inden WM_PAINT bearbejdes).

Jeg har førhen løst problemet med en timer, men det giver programmet en lidt "tung" fornemmelse. Jeg har også udtænkt en måde at "skåne" WM_PAINT på, så den ikke maler HELE komponentet hver gang, men den skal lige finpudses og omdannes til kode, hvilket jeg endnu ikke har gjort, i håb om end nemmere måde.



Thomas



Indlæg senest redigeret d. 14.04.2009 00:39 af Bruger #8985
22 svar postet i denne tråd vises herunder
1 indlæg har modtaget i alt 3 karma
Sorter efter stemmer Sorter efter dato
Tror godt at der kan være nogle småforskelle mellem debug og release mode som muligvis kan have indflydelse.

Ved mig står der "Debug" lige til højre for den grønne pil (start debugging). Den er i toolbaren øverst. Ved mig er det den med knapperne for gem, load, klip, kopier osv.. Kan ikke sige hvor den er ved dig.

Det kan også være et problem med GDI, som "måske" ikke kan løses umiddelbart. Det kan dog også være en lille bug i dit program, men efter hvordan man normalt ville programmere sådan et program finder jeg dette en smule usandsynligt.

Mere behjælpelig kan jeg desværre ikke være.



Var der et spørgsmål gemt et eller andet sted ?
Måske noget kode, vi må se ?



Jeg synes, spørgsmålet - eller problemet - er ret åbenlyst. Ved ikke hvor grundigt, du læste mit indlæg.

Problemet er, at GDI lagger. Så er spørgsmålet jo naturligvis indlysende: Hvordan forhindrer man det?

Det er ikke noget i min kode, der gør det; det er GDI selv. Jeg har lavet et eksempel, der viser problemet:
http://123login.dk/dexo/GDI%20lag%20eksempel.exe

Prøv at lave en 10-15 firkanter med musen (ligesom i Paint), og lav da en ny en, som du ikke giver slip på, men som du konstant ændrer størrelse på. På et tidspunkt giver GDI op, og firkanterne mister deres indhold og får en ny kant. Det tager lidt tid alt efter hvor god, computeren er.



Når jeg trækker, laver, boksene er der et par få streger igennem dem. Efter 50 ca. kan jeg kun se kanten af dem som er sort. Jeg kan godt minimere og maximere uden at det går sort eller noget. Border stregerne er der stadig så. Og jeg kan sagtens lave flere. Jeg kan osse flytte rundt på vinduet.

Der var ingen lag overhovedet på noget tidspunkt.

Måske er problemet forskellige afhængigt af maskinen, .Net versionen, eller den runtime dll der bliver brugt?

Har du prøvet med at vælge release i stedet for debug? Medmindre du kører release lige nu, og se om det gør nogen forskel?



Okay, "lag" er måske heller ikke det rette ord at bruge. Men der kommer nogenlunde samme fejl som i programmet, jeg lige oprettede som eksempel. Det med de få streger i firkanternes baggrund er ikke en fejl, det er bare fordi det blev lavet lidt hurtigt (en bmp gemt i paint).

Jeg har før oplevet et lignende problem og så kompileret koden i Dev-C++ (som i modsætning til VC++ intet har med .net at gøre). Jeg er ret sikker på, problemet er ens på alle maskiner. Det er kun, hvornår fejlen indtræder, der er forskelligt (tror jeg!).

Hvis problemet er runtime dll'en, hvad kan jeg så gøre?

Jeg ved, jeg har set "release" et eller andet sted...... Men nu har jeg glemt, hvor. Jeg trykker bare F5 når jeg ønsker at se resultatet af min kode. Det er vist i "debug"-mode og ikke i "release"-mode. Hvordan kører jeg i "release"-mode?

Noget andet, jeg også lige skal sige er, at jeg har valgt en masse indstillinger for optimering, bla. /O2. Måske er der et par af dem, der går dårligt sammen? Selvom jeg som sagt har oplevet problemet før, og det uden optimeringsindstillinger.

Vi kan jo sammenligne det med Paint, faktisk. Der kan man lave ligeså mange firkanter og trække dem ligeså hurtigt, man vil... Det funger alligevel!



Jeg har fundet release; den var nøjagtig, hvor du sagde den var. Men når jeg kører i release, sker der noget skide underligt: Den siger, den ikke kan finde windows.h (selvom jeg naturligvis har tilføjet den under Additional Include Libraries og alt hvad der nu skal tilføjes). Very curious, indeed.

Så er jeg måske nødt til at benytte timerløsningen. Den er også O.K, om end den ikke er helt optimal.



Prøv at køre windows joblist/taskmanager mens dit program kører. Få joblisten til at vise kolonnen "GDI-objekter". Her vil du kunne se at dit program meget hurtigt kommet til at bruge mange tusinde GDI-objekter, og det går ikke!

Det tyder på at du ikke får nedlagt de GDI-objekter du opretter.



Hej Bertel, jeg håbede sådan du så min tråd.

Jeg er netop gået ind i Joblisten (Ctrl-Shift-Esc, er det ikke den, du mener?), men jeg kan ikke finde "GDI-objekter". Kan du forklare, hvordan man finder den kolonne?

Imens prøver jeg med nogle flere DeleteObject-kald i min editor.



Fra menuen skal du ind under "Vis" og derpå "Vælg Kolonner", her skal du sætte hak i "GDI-Objekter".

Flere tusinde nye GDI-objekter på få sekunder, er pænt mange...

På MSDN skal du læse det der står om frigivelse af objekter meget grundigt, det er ikke altid helt trivielt.



Nå, nu fandt jeg den. Hvordan kan jeg mindste antallet?

Jeg så ikke, du havde svaret. Har du et link til en side på MSDN om at "rydde" op i GDI'en?



Indlæg senest redigeret d. 14.04.2009 23:51 af Bruger #8985
<< < 123 > >>
t