![]() |
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:
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.
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; 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 |
AW: Multithreading Systemressourcen erschöpft
Hallo,
mache mal aus:
Delphi-Quellcode:
BMP1.Create;
BMP2.Create;
Delphi-Quellcode:
edit:
BMP1 := TBitmap.create;
BMP2 := TBitmap.create; und vielleicht noch alles in try .. finally .. end einpacken Grüße Klaus |
AW: Multithreading Systemressourcen erschöpft
siehe Klaus
+ BitBlt Bezieht sich auf ein canvas.Handle + Resourcenschutz |
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? |
AW: Multithreading Systemressourcen erschöpft
Zitat:
![]() |
AW: Multithreading Systemressourcen erschöpft
Hallo,
Ist BitBlt thread safe? Der Canvas ist meines Erachtens nicht Thread safe. Resource Schutzblock:
Delphi-Quellcode:
Grüße
inst := TInst.create
try //tu etwas mit inst finally inst.free end; Klaus |
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... |
AW: Multithreading Systemressourcen erschöpft
BitBlt ist aber eine Systemfunktion - oder..
![]() 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 |
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).
|
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 19:31 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-2025 by Thomas Breitkreuz