AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Programmierung allgemein Algorithmen, Datenstrukturen und Klassendesign Geschwindigkeitsproblem: Screenshots, Bildbearbeitung
Thema durchsuchen
Ansicht
Themen-Optionen

Geschwindigkeitsproblem: Screenshots, Bildbearbeitung

Ein Thema von quetzal1906 · begonnen am 6. Feb 2012 · letzter Beitrag vom 8. Feb 2012
Antwort Antwort
quetzal1906

Registriert seit: 6. Feb 2012
3 Beiträge
 
#1

Geschwindigkeitsproblem: Screenshots, Bildbearbeitung

  Alt 6. Feb 2012, 21:19
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;
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#2

AW: Geschwindigkeitsproblem: Screenshots, Bildbearbeitung

  Alt 6. Feb 2012, 22:09
1. Verdacht: RAM läuft voll - es muss mehr geswappt werden.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#3

AW: Geschwindigkeitsproblem: Screenshots, Bildbearbeitung

  Alt 6. Feb 2012, 22:16
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.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
quetzal1906

Registriert seit: 6. Feb 2012
3 Beiträge
 
#4

AW: Geschwindigkeitsproblem: Screenshots, Bildbearbeitung

  Alt 6. Feb 2012, 23:07
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!

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
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.062 Beiträge
 
Delphi 12 Athens
 
#5

AW: Geschwindigkeitsproblem: Screenshots, Bildbearbeitung

  Alt 7. Feb 2012, 00:14
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#6

AW: Geschwindigkeitsproblem: Screenshots, Bildbearbeitung

  Alt 7. Feb 2012, 01:16
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 übrigens!
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#7

AW: Geschwindigkeitsproblem: Screenshots, Bildbearbeitung

  Alt 7. Feb 2012, 01:45
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
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#8

AW: Geschwindigkeitsproblem: Screenshots, Bildbearbeitung

  Alt 7. Feb 2012, 08:32
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.
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
quetzal1906

Registriert seit: 6. Feb 2012
3 Beiträge
 
#9

AW: Geschwindigkeitsproblem: Screenshots, Bildbearbeitung

  Alt 8. Feb 2012, 14:57
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
  Mit Zitat antworten Zitat
Antwort Antwort


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 09:26 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