Delphi-PRAXiS
Seite 1 von 3  1 23      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Delphi Multithreading Systemressourcen erschöpft (https://www.delphipraxis.net/168701-multithreading-systemressourcen-erschoepft.html)

wangxuebing 5. Jun 2012 10:13

Multithreading Systemressourcen erschöpft
 
Hallo,

ich arbeite an einem Programm, das verschiedene Bilder bearbeitet. Zur Beschleunigung wollte ich Threads verwenden. Leider bekomme ich dabei die Fehlermeldung "Systemressourcen erschöpft", was ich mir nicht so ganz erklären kann (64bit System, 16GB RAM, 8 Kerne)
Der Code sieht grob folgendermaßen aus:

Code:
procedure MyThread.Execute();
var
  BMP1, BMP2 : TBitMap;
  i, j : Integer;
begin
  BMP1.Create;
  BMP2.Create;
  for i := LOW to HIGH do
  begin
    for j := LOW to HIGH do
    begin

    Berechne(x1, y1, x2, y2, PosX1, PosY1, PosX2, PosY2);

    BMP1.Setsize(x1,y1);
    BitBlt(BMP1, 0, 0, BMP1.width, BMP1.height, ThreadBMP, PosX1, PosY1);

    BMP2.Setsize(x2,y2);
    BitBlt(BMP2, 0, 0, BMP2.width, BMP2.height, ThreadBMP, PosX2, PosY2);

    /// vergleiche BMP1 und BMP2

    BMP1.SaveToFile(Filename);

    end;
  end;

  BMP2.Free;
  BMP1.Free;
end;
Die ThreadBMP ist eine private TBitMap vom Thread und wird beim create des Threads geladen (jeder Thread lädt eine andere Datei). LOW und HIGH sind feste Werte, die ich vorher schon berechnet habe.
Das Programm stürzt mal bei "SetSize()" und mal bei "SaveToFile" mit oben genannter Fehlermeldung ab.

Hat jemand eine Idee woran das liegen könnte?
Ich befürchte ja, dass es an den TBitMap liegt, aber jeder Thread hat ja seine eigenen lokalen Bitmaps und somit sollten sich die Threads eigentlich nicht in die Quere kommen...

Danke für eure Hilfe,
WXB

Klaus01 5. Jun 2012 10:18

AW: Multithreading Systemressourcen erschöpft
 
Hallo,

mache mal aus:
Delphi-Quellcode:
BMP1.Create;
BMP2.Create;
Delphi-Quellcode:
BMP1 := TBitmap.create;
BMP2 := TBitmap.create;
edit:

und vielleicht noch alles in try .. finally .. end einpacken

Grüße
Klaus

Bummi 5. Jun 2012 10:22

AW: Multithreading Systemressourcen erschöpft
 
siehe Klaus
+ BitBlt Bezieht sich auf ein canvas.Handle
+ Resourcenschutz

wangxuebing 5. Jun 2012 11:58

AW: Multithreading Systemressourcen erschöpft
 
Sorry, hatte mich verschrieben. Meinte natürlich BMP1 := TBitMap.Create; und auch das BitBlt ist mit Canvas.Handle (hatte nur keine Lust, alles hinzuschrieben ;-) )
Mit einem Thread läufts auch wunderbar durch... Nur ab 2 Threads mag es nimmer...

@Bummi: Wie meinst du das mit dem Ressourcenschutz?

Daniel Schuhmann 5. Jun 2012 12:05

AW: Multithreading Systemressourcen erschöpft
 
Zitat:

Zitat von wangxuebing (Beitrag 1169563)
Wie meinst du das mit dem Ressourcenschutz?

http://www.delphi-treff.de/tutorials...schutzbloecke/

Klaus01 5. Jun 2012 12:06

AW: Multithreading Systemressourcen erschöpft
 
Hallo,

Ist BitBlt thread safe?

Der Canvas ist meines Erachtens nicht Thread safe.

Resource Schutzblock:

Delphi-Quellcode:
inst := TInst.create
try
  //tu etwas mit inst
finally
  inst.free
end;
Grüße
Klaus

wangxuebing 5. Jun 2012 12:10

AW: Multithreading Systemressourcen erschöpft
 
Hab grad alles was der Thread macht in Try...finally..end; gepackt. Bringt aber keine Veränderung.
Macht das dem BitBlt was aus, wenn es von einem lokalen Bild etwas in ein anderes lokales Bild in zwei verschiedenen Threads malt?
Bei gleicher Source oder Destination würd ich das ja verstehen, aber wenn die doch lokal im Thread definiert/erzeugt werden...

Klaus01 5. Jun 2012 12:14

AW: Multithreading Systemressourcen erschöpft
 
BitBlt ist aber eine Systemfunktion - oder..

Hier findest Du ein Beispiel wie Du BitBlt thread safe verwenden kannst.

BitBlt benötigt GDI resourcen (die sind nicht unbegrenzt verfügbar) - aber bei zwei aktiven Threads sollte das noch kein Problem darstellen.

Grüße
Klaus

wangxuebing 5. Jun 2012 15:01

AW: Multithreading Systemressourcen erschöpft
 
Gibts ne Möglichkeit das Bitmap nicht im Graphikkartenspeicher sondern im Arbeitsspeicher zu halten? Weil davon sollte ich genug haben (50% frei laut Ressourcenmonitor).

himitsu 5. Jun 2012 15:10

AW: Multithreading Systemressourcen erschöpft
 
Das liegt doch im Arbeitsspeicher?


Höchstens wenn man es anzeigt liegt zusätzlich noch etwas davon (eine Kopie) im Grafikspeicher, aber das sollte dort nicht auffallen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:00 Uhr.
Seite 1 von 3  1 23      

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