Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi TTimer Speicherproblem (EOutOfResource Error) (https://www.delphipraxis.net/132055-ttimer-speicherproblem-eoutofresource-error.html)

Periander 5. Apr 2009 12:50


TTimer Speicherproblem (EOutOfResource Error)
 
Hallo,

ich hoffe ich bin in diesem Unterforum richtig mit meiner Frage.
Folgendes Problem:

Ich habe ein Kleines Programm geschrieben, dass ein externes fernsteuert.
Realisiert habe ich das über TTimer. Allerdings stürzt das Programm nach ca. einer Stunde laufzeit ab und
erzeugt einen OutofResource Fehler.

Ich habe mir im Taskmanager das Programm angeschaut und festgestellt, dass der dem Programm zugwiesenen Speicher stetig steigt.

Im folgenden ein Codeausschnitt. Ich hoffe ihr könnt mir weiterhelfen.


Die Funktion mit der ich veränderungen im zu kontrollierenden Programm wahrnehme.

Delphi-Quellcode:

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;


Delphi-Quellcode:
procedure TForm1.healerTimer(Sender: TObject);
begin
if start=true then
begin
try
  begin
if ((desktopcolor(112,53)<>stringtocolor('$0020790B')))then
begin
  sleep(800);
  if desktopcolor(141,50)<>stringtocolor('$0039B648')then
  begin
  sendkeys('%ß',true);
  sleep(1700);
  sendkeys('5',true);
  sleep(2000);
  sendkeys('6',true);
  sleep(1700);
  sendkeys('7',true);
  sleep(2000);
  end
else begin sleep (2000); end;
end;
Ansonsten habe ich noch ein paar weitere Timer, die sich nacheinander aufrufen.

Meine vermutung ist, dass es irgendwas mit dem handel aus der DesktopColor Funktion zu tun hat. Habt ihr eine Idee?

LG.

jaenicke 5. Apr 2009 13:00

Re: TTimer Speicherproblem (EOutOfResource Error)
 
Zitat:

Zitat von Periander
Meine vermutung ist, dass es irgendwas mit dem handel aus der DesktopColor Funktion zu tun hat. Habt ihr eine Idee?

Da sehe ich nichts verdächtiges, du hast nur viel zu viel Quelltext. Du musst doch nicht extra ein TCanvas erzeugen, nur um dessen Handle als Variable zu verwenden. :shock:
Delphi-Quellcode:
function DesktopColor(const x,y: integer): TColor;
begin
  Result := GetPixel(GetWindowDC(GetDesktopWindow), x, y);
end;
Setze im Projektquelltext (Projekt --> Quelltext anzeigen) einfach einmal ReportMemoryLeaksOnShutDown auf True, dann bekommst du die beim Beenden des Programms angezeigt. Das geht allerdings erst ab Turbo Delphi / Delphi 2006.

Vorher und für mehr Details kannst du FastMM verwenden.

Dann noch andere Sachen:
Statt Sleep würde ich Delay benutzen, sonst hängt das Programm immer:
http://www.delphipraxis.net/internal...ect.php?t=7355

Zitat:

Zitat von Periander
Delphi-Quellcode:
if start=true then

Der Vergleich mit true ist nicht nur unlogisch sondern falsch.
Hier habe ich mal ein kleines Beispiel gebastelt, wann es schief geht:
http://www.delphi-forum.de/viewtopic...=548760#548760
Mehr dazu steht hier:
http://www.delphi-treff.de/tutorials...werten/page/4/

Zitat:

Zitat von Periander
Ansonsten habe ich noch ein paar weitere Timer, die sich nacheinander aufrufen.

Dann hast du beim Konzept vermutlich einiges falsch gemacht. Mit der richtigen Logik braucht man nicht viele Timer.

Periander 6. Apr 2009 00:01

Re: TTimer Speicherproblem (EOutOfResource Error)
 
danke für die hinweise.

habe sie soweit befolgt und nun auch den ganzen code in einen einzigen timer gepackt.
leider besteht das problem weiterhin. ich bin ratlos.

Satty67 6. Apr 2009 00:04

Re: TTimer Speicherproblem (EOutOfResource Error)
 
Hallo,

braucht GetWindowDC nicht auch ein ReleaseDC?

jaenicke 6. Apr 2009 00:47

Re: TTimer Speicherproblem (EOutOfResource Error)
 
Stimmt, siehe Dokumentation:
Zitat:

Zitat von [url=http://msdn.microsoft.com/en-us/library/dd144947.aspx
Dokumentation[/url]]After painting is complete, the ReleaseDC function must be called to release the device context. Not releasing the window device context has serious effects on painting requested by applications.

Delphi-Quellcode:
function DesktopColor(const x,y: integer): TColor;
var
  DesktopDC: HDC;
begin
  DesktopDC := GetWindowDC(GetDesktopWindow);
  Result := GetPixel(DesktopDC, x, y);
  ReleaseDC(DesktopDC);
end;

Periander 6. Apr 2009 00:55

Re: TTimer Speicherproblem (EOutOfResource Error)
 
hey danke, auf den ersten blick sieht der speicher super aus,
werde das nun mal länger testen.

der korrekte code für die funktion heißt dann:

Delphi-Quellcode:
function DesktopColor(const x,y: integer): TColor;
var
  DesktopDC: HDC;
begin
  DesktopDC := GetWindowDC(GetDesktopWindow);
  Result := GetPixel(DesktopDC, x, y);
  ReleaseDC(GetDesktopWindow,DesktopDC);
end;


Alle Zeitangaben in WEZ +1. Es ist jetzt 10:31 Uhr.

Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz