Avatar billede nextstop Nybegynder
29. september 2004 - 08:40 Der 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...?
Avatar billede nextstop Nybegynder
29. september 2004 - 08:48 #1
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.
Avatar billede jpk Nybegynder
29. september 2004 - 09:02 #2
Det kunne lyde som om der er nogle resource handles der ikke frigives.
Det kan fx være handles af typen HBRUSH og HPEN
Avatar billede nextstop Nybegynder
29. september 2004 - 10:11 #3
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);.
Avatar billede jpk Nybegynder
29. september 2004 - 10:18 #4
Og DeleteObject kaldes ALTID?
Altså der er ikke nogle "if(et_eller_andet)" så return eller lign. så DeleteObject springes over?
Avatar billede jpk Nybegynder
29. september 2004 - 10:20 #5
Hvad er returværdi fra DeleteObject?
Er den altid TRUE?
Avatar billede jpk Nybegynder
29. september 2004 - 10:21 #6
Du skal huske at brush'en skal "deselectes" igen, før DeleteObject!
Avatar billede mollevp Nybegynder
29. september 2004 - 10:22 #7
Prøv at unlade at oprette og slette brushen hele tiden... Bare Delete den når du får en WM_DESTROY..
Avatar billede nextstop Nybegynder
29. september 2004 - 11:05 #8
Returværdi fra DeleteObject var altid true.

Ref. >haxholm< har jeg forsøgt at ændre det, således:

static HBRUSH hBrush = NULL;
// ...
case WM_PAINT :
// ...
  hDC = BeginPaint( hWnd, (LPPAINTSTRUCT) &PStr);
  if(hBrush == NULL) hBrush = CreateSolidBrush(GetSysColor(COLOR_WINDOW));
  FillRect( hDC, (PRECT) &rClient, hBrush);
// ...
  EndPaint(hDC, &PStr);
  break;
case WM_DESTROY :
  if(hBrush != NULL) DeleteObject(hBrush);
  hBrush = NULL;
  break;
// ...

Er det måden at gøre det på?

Det gør desværre ingen forskel. Jeg tror mere, at problemet optræder ved skrivning med DrawText(...), så jeg prøver lige at dykke ned i dette.
Avatar billede nextstop Nybegynder
29. september 2004 - 11:07 #9
Er der forresten en god måde at tjekke på, hvor meget memory programmet bruger før/efter WM_PAINT?
Avatar billede mollevp Nybegynder
29. september 2004 - 11:18 #10
Hov prøv også at CreateSolidBrush under WM_CREATE.. Så vælger du den bare med Selectobject...

Men jeg tviler også efterhånden på at det er det...
Avatar billede benjax Nybegynder
04. oktober 2004 - 12:55 #11
Så fandt jeg ud af, hvor hunden var begravet. Man skal huske at lave en DeleteDC(hDC) efter EndPaint(...) - så virker det.
Avatar billede Ny bruger Nybegynder

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.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester