Ik heb een proggie geschreven waarin een stukje code zit dat om de zoveel miliseconden in de systemtray een lijn tekent.
Nu viel het me echter op dat hoe langer het programma draait, hoe meer geheugen het in beslag neemt.
Ik heb inmiddels een hoop eruit gefiltert en kwam zo tot de ontdekking dat het geheugenlek in deze functie zit:
TrayNWnd is een globale variabele die wordt gezet dmv:
Als ik dus in de taskmanager kijk, komt er bij elke aanroep van de Timer-event zo'n 4K geheugen bij.
Dit is niet het geval als ik ClockCanvas ook gelobaal definieer en bij het aanmaken van het form aanmaak.
Maar dan werkt het tekenen op het canvas niet goed.
Weet iemand hoe ik wat aan dit geheugen-lek kan doen ?
Nu viel het me echter op dat hoe langer het programma draait, hoe meer geheugen het in beslag neemt.
Ik heb inmiddels een hoop eruit gefiltert en kwam zo tot de ontdekking dat het geheugenlek in deze functie zit:
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
| procedure TForm1.Timer1Timer(Sender: TObject);
begin
if TrayNWnd <> 0 then
begin
ClockCanvas := TCanvas.Create();
ClockCanvas.Handle := GetWindowDC(TrayNWnd);
if GotMessage then
ClockCanvas.Pen.Color := clGray
else
ClockCanvas.Pen.Color := clRed;//BtnFace;
if ClockCanvas.TryLock Then
begin
ClockCanvas.MoveTo(0, 20);
ClockCanvas.LineTo(320, 20);
PostMessage(TrayNWnd, WM_PAINT, 0, 0);
ClockCanvas.Unlock;
end;
ClockCanvas.Free;
end;
GotMessage := Not GotMessage;
end; |
TrayNWnd is een globale variabele die wordt gezet dmv:
code:
1
2
| TrayWnd := FindWindow('Shell_TrayWnd', nil);
TrayNWnd := FindWindowEx(TrayWnd, 0, 'TrayNotifyWnd', nil); |
Als ik dus in de taskmanager kijk, komt er bij elke aanroep van de Timer-event zo'n 4K geheugen bij.
Dit is niet het geval als ik ClockCanvas ook gelobaal definieer en bij het aanmaken van het form aanmaak.
Maar dan werkt het tekenen op het canvas niet goed.
Weet iemand hoe ik wat aan dit geheugen-lek kan doen ?