Entwickler-Ecke

Multimedia / Grafik - GetWindowDC(GetDesktopWindow) - HÄ?


phase - Di 04.03.03 15:02
Titel: GetWindowDC(GetDesktopWindow) - HÄ?
Hi erstmal,
mit folgender Funktion kann man die Farbe eines Pixels auf dem Desktop ermitteln:


Quelltext
1:
2:
3:
4:
5:
6:
7:
8:
function DesktopColor(const x,y:integer):TColor; 
var c: TCanvas; 
begin 
 c:=TCanvas.create; 
 c.handle:=GetWindowDC(GetDesktopWindow); 
 result:=getpixel(c.handle,x,y); 
 c.free; 
end;


Das Problem ist jedoch, dass ein Programm, welches in einer Schleife alle 10ms diese Funktion ausführt, stetig an (Arbeits-)Speicher zunimmt, bis es irgendwann abstürzt. Manchmal kommt die Fehlermeldung "Canvas does not allow drawing." (Es geht bei 1.900 MB los, und stürzt bei ca. 7.200 MB ab)
Ich habe den Quelltext mehrmals durchgesehen und garantiert nirgendwo vergessen irgendein Objekt freizugeben.
Woran kann das ganze liegen?

Danke im Vorraus,
phase


mth - Di 04.03.03 15:47
Titel: Re: GetWindowDC(GetDesktopWindow) - HÄ?
phase hat folgendes geschrieben:

Ich habe den Quelltext mehrmals durchgesehen und garantiert nirgendwo vergessen irgendein Objekt freizugeben.
Woran kann das ganze liegen?


Aber natürlich hast du ein Objekt (eine Resource) nicht freigegenen: Den Device Context (DC). Auf ein GetWindowDC muß irgendwann ein ReleaseDC folgen.


phase - Di 04.03.03 16:35

Aha, größten Dank!
Ich werde mich sogleich betätigen...

(Ich muss gestehen, dass ich die Funktion einfach nur us dem Internet übernommen habe)

Gruß,
phase


maximus - Di 04.03.03 19:58

Wenn dein prog tausende mal auf den desktop zugreift, würd ich mir den DeviceContext und das canvas nur einmal erstellen/freigeben...alles andere wäre programmiererischer wahnsinn :wink:

Quasi die procedure aufteilen. In eine Init, get, deInit procedure!