29. september 2004 - 08:40Der er
10 kommentarer og 1 løsning
Program crasher XP's vindueshåndtering
Jeg har et underligt problem med et større program skrevet i C, og oversat med Borland C++ Builder. Programmets hovedvindue indeholder et slags regneark, som man kan bevæge sig rundt i og indtaste tal i cellerne. Det er noget gammlet kode, så der bruges ikke en grid-komponent eller lignende - i stedet styres visningen i vinduet manuelt, og teksten skrives med DrawText(...)-metoden.
Problemet er, at hvis man har flyttet sig rundt med pilene ca. 2700 gange, begynder hele Windows at opføre sig mærkeligt. Skærmbilledet kan ikke tegnes ordentligt, og andre Windows-programmer, man måtte have kørende samtidigt, kan heller ikke gentegne deres billede korrekt. Man er faktisk nødt til at genstarte PC'en, for at den kører nogenlunde stabilt.
Jeg har oversat med CodeGuard, men der er ingen memory leaks eller fejlagtige pointerreferencer.
Jeg er således ved at gå ud at mit gode skind. Hvad kan få XP til at gå helt galt på den måde? Problemet optræder på forskellige PC'er, alle med XP. Der ser ikke ud til at være noget i vejen, når man kører det under Windows98.
Er der mon nogen, der har en god idé til, hvad der kan få XP's vindueshåndtering til at gå ned med et hult drøn...?
Jeg skylder lige at sige, at når programmet begynder at opføre sig ustabilt, er der ikke nogen processer, der sluger CPU-tid eller memory, ifølge tasklisten.
Programmet kører rent faktisk videre "inde bagved", man kan bare ikke regne med det, der bliver skrevet på skærmen. Det hjælper heller ikke noget at minimere/restore vinduerne.
Jeg tror, du har fat i noget af det rigtige. Hver gang billedet skal opdateres, bliver der spist 4Kb ifølge tasklisten.
Men når jeg kigger koden igennem med en tættekam, kan jeg ikke se, at der mangler frigivelse af ressourcer.
Jeg har en hDC = BeginPaint(hWnd, (LPPAINTSTRUCT) &PStr); med en tilhørende EndPaint( hDC, &PStr);. Derudover er der en HBRUSH hbr = CreateSolidBrush(clr) med en tilhørende DeleteObject(hbr);.
Så fandt jeg ud af, hvor hunden var begravet. Man skal huske at lave en DeleteDC(hDC) efter EndPaint(...) - så virker det.
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.