Autor Beitrag
phase
Hält's aus hier
Beiträge: 5



BeitragVerfasst: Di 04.03.03 15:02 
Hi erstmal,
mit folgender Funktion kann man die Farbe eines Pixels auf dem Desktop ermitteln:

ausblenden 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 34



BeitragVerfasst: Di 04.03.03 15:47 
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 Threadstarter
Hält's aus hier
Beiträge: 5



BeitragVerfasst: 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
ontopic starontopic starontopic starontopic starontopic starontopic starontopic starhalf ontopic star
Beiträge: 896

Win XP, Suse 8.1
Delphi 4/7/8 alles prof
BeitragVerfasst: 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!