Om jag allokerar en resurs (tex SelectObject(dc,MyPen)) inne i en frekvent upprepad "Window Message" (tex WM_PAINT) måste jag då frigöra resursen med "DeleteObject" innan jag returnerar. Eller räcker det att jag frigör resurserna när jag stänger applikationen(i WM_CLOSE/WM_DESTROY) för att inte ett resursläckage ska uppstå?
Frigör resurserna innan du returnerar. Ett tips är att kapsla in all sådan resursallokering i klasser som gör "SelectObject" i konstruktorn och "DeleteObject" i destruktorn. Då räcker det med att skapa ett sådant objekt inne i det kodblock eller den funktion som utförs/anropas när WM_PAINT skickas och sedan faller det ut ur "scope" och resursen frigörs "av sig själv".
Faran ligger väl i programmeringsstilen som lätt genererar svårhittade fel. Speciellt viktigt när man jobbar i större projekt då kanske andra sitter och jobbar med ens kod. Kodning "ska" ju generellt sett utföras på ett sätt som minimerar riskerna.
Faran är att allokering tar tid och WM_PAINT kommer i massor så fort man ens rör musen över fönstret. Generellt sett så ska man försöka göra så lite som möjligt i eventhandlers, speciellt VM_PAINT.
Frigör man allt man allokerar så är det nog inga större problem. Allting i ett Windows-program styrs ifrån event-handlers. Skulle man förbjudas att allokera något i dem blir det väldigt svårt att skriva ett program.
Att allokera minne tar inte alls så lång tid. Med dagens snabba datorer kan du allokera extremt många gånger innan det blir märkbart.
Man ska minimera tiden i eventhandlern. Det är tom en rekommendation utfärdad av Microsoft själva. Man kan ju få andra störningar som gör att man inte avallokerar resurserna korrekt. I windows är det ju inte enbart frågan av minne. Det kan vara handles till fönster, menyer, filer etc. Man får extremt svårdebuggade fel då man får slut på resurser. T ex så kan man få upp menyer utan text etc.
Om jag inte misstar mig så uppdateras inte WM_PAINT eller de andra WindowsMessage-erna så fruktansvärt ofta i förhållande till datrorns klockfrekvens, som några av de ovanstående skribenterna antyder. Sedan är väl et ganska centralt prejudikat i C++ att man ska nestla sina variabler, jag kan inte förstå varför denna regel inte skulle gälla här.
Kolla med verktyget Spy+ så ser du uppdateringen. Man får meddelandet så fort man för musen över fönsteret, så fort man rör på fönstret, så fort något annat fönster överlappar. Dvs rätt så ofta. Sätt en brytpunkt i eventhandlern så ser du att man kommer dit så fort nått som har med att fönstret ska ritas om inträffar.
255 ms totalt · 4 externa anrop · v20260731065814-full.86ec41c2