Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   Geschwindigkeitsproblem: Screenshots, Bildbearbeitung (https://www.delphipraxis.net/166295-geschwindigkeitsproblem-screenshots-bildbearbeitung.html)

quetzal1906 6. Feb 2012 20:19

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;

hathor 6. Feb 2012 21:09

AW: Geschwindigkeitsproblem: Screenshots, Bildbearbeitung
 
1. Verdacht: RAM läuft voll - es muss mehr geswappt werden.

Medium 6. Feb 2012 21:16

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.

quetzal1906 6. Feb 2012 22:07

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:
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;
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!

Zitat:

Zitat von hathor (Beitrag 1149540)
1. Verdacht: RAM läuft voll - es muss mehr geswappt werden.

Danke für die Antwort, nur, was bedeutet das? ^^ was heißt mehr geswappt werden?

Danke fürs Lesen,
quetzal

himitsu 6. Feb 2012 23:14

AW: Geschwindigkeitsproblem: Screenshots, Bildbearbeitung
 
Zitat:

geswappt
Kennst du die Auslagerungsdatei/Pagefile?

Wird der RAM zu voll, dann fängt Windows an diesen auf die Festplatte auszulagern.
Und die Festplatte ist nunmal langsamer.

Medium 7. Feb 2012 00:16

AW: Geschwindigkeitsproblem: Screenshots, Bildbearbeitung
 
Zitat:

Zitat von quetzal1906 (Beitrag 1149554)
sieht dann so aus? War das was du meintest?

Jap :)
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:
handleDC:=GetWindowDC(h);
try
  // foo
finally
  ReleaseDC(h, handleDC);
end;
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 :)


Herzlich willkommen in der :dp: übrigens!

hathor 7. Feb 2012 00:45

AW: Geschwindigkeitsproblem: Screenshots, Bildbearbeitung
 
Zitat:

Zitat von quetzal1906 (Beitrag 1149554)
Zitat:

Zitat von hathor (Beitrag 1149540)
1. Verdacht: RAM läuft voll - es muss mehr geswappt werden.

Danke für die Antwort, nur, was bedeutet das? ^^ was heißt mehr geswappt werden?

Danke fürs Lesen,
quetzal

http://de.wikipedia.org/wiki/Auslagerungsdatei
http://de.wikipedia.org/wiki/Swapping
http://en.wikipedia.org/wiki/Paging

Sir Rufo 7. Feb 2012 07:32

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.

quetzal1906 8. Feb 2012 13:57

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 05:24 Uhr.

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