AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Multithreading Systemressourcen erschöpft

Ein Thema von wangxuebing · begonnen am 5. Jun 2012 · letzter Beitrag vom 6. Jun 2012
Antwort Antwort
Seite 1 von 3  1 23      
wangxuebing

Registriert seit: 17. Feb 2012
7 Beiträge
 
#1

Multithreading Systemressourcen erschöpft

  Alt 5. Jun 2012, 11:13
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
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#2

AW: Multithreading Systemressourcen erschöpft

  Alt 5. Jun 2012, 11:18
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
Klaus
  Mit Zitat antworten Zitat
Benutzerbild von Bummi
Bummi

Registriert seit: 15. Jun 2010
Ort: Augsburg Bayern Süddeutschland
3.470 Beiträge
 
Delphi XE3 Enterprise
 
#3

AW: Multithreading Systemressourcen erschöpft

  Alt 5. Jun 2012, 11:22
siehe Klaus
+ BitBlt Bezieht sich auf ein canvas.Handle
+ Resourcenschutz
Thomas Wassermann H₂♂
Das Problem steckt meistens zwischen den Ohren
DRY DRY KISS
H₂ (wenn bei meinen Snipplets nichts anderes angegeben ist Lizenz: WTFPL)
  Mit Zitat antworten Zitat
wangxuebing

Registriert seit: 17. Feb 2012
7 Beiträge
 
#4

AW: Multithreading Systemressourcen erschöpft

  Alt 5. Jun 2012, 12:58
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?
  Mit Zitat antworten Zitat
Benutzerbild von Daniel Schuhmann
Daniel Schuhmann

Registriert seit: 16. Jul 2005
Ort: München
391 Beiträge
 
Turbo Delphi für Win32
 
#5

AW: Multithreading Systemressourcen erschöpft

  Alt 5. Jun 2012, 13:05
Wie meinst du das mit dem Ressourcenschutz?
http://www.delphi-treff.de/tutorials...schutzbloecke/
Daniel Schuhmann
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#6

AW: Multithreading Systemressourcen erschöpft

  Alt 5. Jun 2012, 13:06
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
Klaus
  Mit Zitat antworten Zitat
wangxuebing

Registriert seit: 17. Feb 2012
7 Beiträge
 
#7

AW: Multithreading Systemressourcen erschöpft

  Alt 5. Jun 2012, 13:10
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...
  Mit Zitat antworten Zitat
Klaus01

Registriert seit: 30. Nov 2005
Ort: München
5.768 Beiträge
 
Delphi 10.4 Sydney
 
#8

AW: Multithreading Systemressourcen erschöpft

  Alt 5. Jun 2012, 13:14
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
Klaus

Geändert von Klaus01 ( 5. Jun 2012 um 14:16 Uhr)
  Mit Zitat antworten Zitat
wangxuebing

Registriert seit: 17. Feb 2012
7 Beiträge
 
#9

AW: Multithreading Systemressourcen erschöpft

  Alt 5. Jun 2012, 16:01
Gibts ne Möglichkeit das Bitmap nicht im Graphikkartenspeicher sondern im Arbeitsspeicher zu halten? Weil davon sollte ich genug haben (50% frei laut Ressourcenmonitor).
  Mit Zitat antworten Zitat
Benutzerbild von himitsu
himitsu

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

AW: Multithreading Systemressourcen erschöpft

  Alt 5. Jun 2012, 16:10
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.
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 3  1 23      


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 01:15 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