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;