![]() |
Delphi-Version: 7
Speicherauslastung senken
Joho,
habe eine Anwendung, die in mehreren gleichen Durchläufen Klicks auf dem Bildschirm ausführt. Hierzu ist nach einigen Klicks etwas Wartezeit eingebaut, entweder statisch über Sleep oder dynamisch über folgende Prozedur:
Delphi-Quellcode:
Die Prozedur kontrolliert die übergebenen Koordinaten solange, bis der Pixel entweder die übergebene Farbe hat, oder die andere Abbruchbedingung erfüllt ist.
procedure Warten(x,y,Farbe: integer);
var C: TCanvas; Count, Pixel: integer; begin Count := 0; repeat if Count = 0 then C := TCanvas.Create; C.Handle := GetWindowDC(GetDesktopWindow); Pixel := GetPixel(C.Handle,x,y); inc(Count); until (Pixel = Farbe) or (Count = 1000); C.Free; end; Diese Prozedur wird mehrfach an verschiedenen Stellen aufgerufen. Nach jedem Durchlauf habe ich testweise meine Speicherauslastung mit der ![]() Was aber das eigentliche Problem ist: mit jedem Durchlauf nimmt die Geschwindigkeit ab, beim 1. und 2. gehts noch, aber beim 3. oder spätestens beim 4. werden die Aktionen deutlich langsamer ausgeführt. Die statischen Wartezeiten reichen dann oft nicht mehr, und das Programm verheddert sich. Aber hey, ich hab 4GB RAM, da können diese 0,5 MB doch keinen Unterschied machen?! Hoffe jemand kann etwas gegen meine Verwirrung tun ... Danke ;) |
AW: Speicherauslastung senken
Kein Wunder:
Delphi-Quellcode:
Du erstellst bei jedem Schleifendurchlauf einen Canvas und gibst nur einen hinter der Schleife wieder frei.
repeat
if Count = 0 then C := TCanvas.Create; C.Handle := GetWindowDC(GetDesktopWindow); Pixel := GetPixel(C.Handle,x,y); inc(Count); until (Pixel = Farbe) or (Count = 1000); C.Free; |
AW: Speicherauslastung senken
Delphi-Quellcode:
Begründung:
procedure Warten(x,y,Farbe: integer);
var C: TCanvas; Count, Pixel: integer; begin Count := 0; c := TCanvas.Create; try repeat C.Handle := GetWindowDC(GetDesktopWindow); Pixel := GetPixel(C.Handle,x,y); inc(Count); ReleaseDC(c.Handle); until (Pixel = Farbe) or (Count = 1000); finally C.Free; end; end; Zitat:
Klaus |
AW: Speicherauslastung senken
ReleaseDC fehlt auch ...
Delphi-Quellcode:
begin
C := TCanvas.Create; try C.Handle := GetWindowDC(GetDesktopWindow); try repeat Pixel := GetPixel(C.Handle,x,y); inc(Count); until (Pixel = Farbe) or (Count = 1000); finally ReleaseDC(C.Handle) end; finally C.Free; end; end; |
AW: Speicherauslastung senken
Au weia. Das dabei auch nen Objekt erzeugt wird wusste ich garnich ... manchmal ist Copy-Paste eben gefährlich, grade wenn der Code so unsauber is. ^^
Danke für deine Hilfe! Wenn ich nen ReleaseDC einbaue gehts tatsächlich völlig flüssig ... warum ich trotz 4 GB RAM eine Mehrbelastung des Speichers von vlt 1,5 MB sofort spüre, verstehe ich aber trotzdem nicht ... ;) |
AW: Speicherauslastung senken
Der Speicherverbrauch dürfte auch nicht die direkte Ursache für den Geschwindigkeitsverlust sein.
Ohne "ReleaseDC" muss Windows immer mehr Gerätekontexte verwalten. |
Alle Zeitangaben in WEZ +1. Es ist jetzt 14:38 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