![]() |
Geschwindigkeitsproblem: Screenshots, Bildbearbeitung
Hallo,
Ich hab seit langer Zeit mal wieder mein Delphi ausgepackt, und probiere etwas rum. Erst mal eine Beschreibung was das Programm macht: In einem 50ms Timer wird ein Screenshot eines externen Fensters gemacht und in einem 24bit Bitmap gespeichert. Dann wird mittels BitBlt ein Teil des Screenshots (336*277) in zwei weiter 24bitmap bilder kopiert zur weiteren Verarbeitung. Das eine der neuen Bitmaps wird mit Bitblt und "mergepaint"-Parameter mit einem früheren Bild überlagert (Um unterschiede zum vorherigen Bild zu sehen). Die beiden Bitmaps werden dann jeweils einmal je Timerdurchlauf mit Hilfe von Scanline komplett untersucht und einige Pixelfarben geändert. Auf Eines der Bilder werden dann noch einige geometrische Figuren gezeichnet (ca. 5 Kreise/Rechtecke) dann in einer Paintbox angezeigt. Der rest des Programmes sind nur einfache Rechenaufgaben, die eigentlich keine Probleme machen sollten. Ich schreib das deshalb so genau auf, weil ich keine Idee hab warum folgendes passiert: Ich starte das Programm, es funktioniert alles, nur nach 5 Minuten merkt man zunehmend, dass sich das Programm verlangsamt, gefühlsmäßig auch das Programm von dem screenshots gemacht werden.. Schließt man jetzt das Delphiprogramm, dauert es ziemlich lange bis Delphi das Programm beendet hat und man den Editor wieder benutzen kann. Woran könnte das alles wohl liegen? Im Anfang läufts ja flüssig.. Mag Delphi keine unschönen Bitmapgrößen wie 336*277 zur Bearbeitung? Kann Scanline Probleme machen alle 50ms 2mal? BitBlt sollte ja eigentlich recht schnell sein. Vielleicht ein Problem mit den screenshots.. aber wieso gehts im Anfang flüssig? Hat jemand eine Idee? Für mehr Informationen bitte fragen. Vielen Dank, quetzal PS: Screenshots werden mit dieser Methode gemacht, an deren Quelle ich mich gerade nicht erinnere, vermutlich aus dem Forum kopiert:
Delphi-Quellcode:
function FormularScreenShot(Bmp: TBitmap; h : hWnd): Boolean;
var Rec: TRect; iWidth, iHeight: Integer; begin with Bmp do try GetWindowRect(h, Rec); iWidth := Rec.Right - Rec.Left; iHeight := Rec.Bottom - Rec.Top; Width := iWidth; Height := iHeight; BitBlt(Canvas.Handle, 0, 0, iWidth, iHeight, GetWindowDC(h), 0, 0, SRCCOPY); Result := True; finally ReleaseDC(h, GetWindowDC(h)); end; end; |
AW: Geschwindigkeitsproblem: Screenshots, Bildbearbeitung
1. Verdacht: RAM läuft voll - es muss mehr geswappt werden.
|
AW: Geschwindigkeitsproblem: Screenshots, Bildbearbeitung
An den genannten Operationen an und für sich sehe ich zunächst nichts falsches. Du solltest eine Ecke mehr Code posten, weil nur aufgrund einer Beschreibung wird das schwer zu analysieren. Mein Anfangsverdacht hat sich in deinem Codeschnipsel auch zumindest schon etwas bestätigt: Du forderst dort zwei Mal einen DC an, den du nicht wieder freigibst. Die GDI Resourcen sind recht begrenzt, da betagtes Subsystem, und dort könnte es dann recht flott eng werden bei so kurzen Zykluszeiten.
|
AW: Geschwindigkeitsproblem: Screenshots, Bildbearbeitung
Hallo,
Ich hab das mit den DC`s freigeben jetzt so verstanden dass ich mir beim screenshot machen nur einmal eins hole, und dasselbe dann wieder freigebe:
Delphi-Quellcode:
sieht dann so aus? War das was du meintest? Also im ersten Testlauf hab ich nach 10minuten keine Verlangsamung bemerkt. Also schonmal danke für die Idee!
function FormularScreenShot(Bmp: TBitmap; h : hWnd): Boolean;
var Rec: TRect; iWidth, iHeight: Integer; handleDC:hwnd; begin with Bmp do try GetWindowRect(h, Rec); iWidth := Rec.Right - Rec.Left; iHeight := Rec.Bottom - Rec.Top; Width := iWidth; Height := iHeight; handleDC:=GetWindowDC(h); BitBlt(Canvas.Handle, 0, 0, iWidth, iHeight, handleDC, 0, 0, SRCCOPY); Result := True; finally ReleaseDC(h, handleDC); end; end; Zitat:
Danke fürs Lesen, quetzal |
AW: Geschwindigkeitsproblem: Screenshots, Bildbearbeitung
Zitat:
Wird der RAM zu voll, dann fängt Windows an diesen auf die Festplatte auszulagern. Und die Festplatte ist nunmal langsamer. |
AW: Geschwindigkeitsproblem: Screenshots, Bildbearbeitung
Zitat:
Im wesentlichen auch sauber so, bis auf, dass ich das Handle vor dem try..finally abholen würde. Ich glaube zwar, dass das Freigeben eines ungültigen Handles im Fehlerfall nicht so tragisch ist, aber des Prinzips wegen:
Delphi-Quellcode:
Ansonsten wären die weiteren Routinen interessant, in denen das Bitmap weiter verarbeitet wird. Delphis TBitmap Klasse nutzt intern auch ein wenig GDI-Zauber, und verbraucht dementsprechend auch dort Resourcen dieser API. Wenn da aber alles an temporärem Zeug fein säuberlich freigegeben wird, und das schon auch mittel- bis langfristig Besserung geschaffen hat, dann freu ich mich ja schon :)
handleDC:=GetWindowDC(h);
try // foo finally ReleaseDC(h, handleDC); end; Herzlich willkommen in der :dp: übrigens! |
AW: Geschwindigkeitsproblem: Screenshots, Bildbearbeitung
Zitat:
![]() ![]() ![]() |
AW: Geschwindigkeitsproblem: Screenshots, Bildbearbeitung
Was mit noch so auffällt:
Der Rückgabewert macht keinen Sinn. Der ist immer true ... bzw. undefiniert, wenn innerhalb der Funktion eine Exception auftaucht. Aber selbst dann würde ein definierter Rückgabewert auch nicht weiter helfen, weil die Exception in der Funktion nicht abgefangen wird und somit die weitere Ausführung unterbricht. |
AW: Geschwindigkeitsproblem: Screenshots, Bildbearbeitung
Hi, und Danke für die ganzen Antworten.
Die Sache mit den DC's hat das Problem gelöst, habs mal 2 stunden laufen lassen und hatte keine Geschwindigkeitsprobleme! Danke aber auch für die anderen Hinweise, hilft ja alles beim Optimieren ;) schöne Grüße, quetzal |
Alle Zeitangaben in WEZ +1. Es ist jetzt 11:16 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 by Thomas Breitkreuz