Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Algorithmen, Datenstrukturen und Klassendesign (https://www.delphipraxis.net/78-algorithmen-datenstrukturen-und-klassendesign/)
-   -   List of Tbitmaps gleichzeitig bearbeiten (https://www.delphipraxis.net/208375-list-tbitmaps-gleichzeitig-bearbeiten.html)

bernhard_LA 21. Jul 2021 13:12

List of Tbitmaps gleichzeitig bearbeiten
 
der serielle code ohne OTL lib funktioniert,
mein OTL code funktioniert nicht , ich sehe meinen Fehler nicht


Delphi-Quellcode:

uses .... , OtlParallel, ...... ;

type
   TMeinRecord = record
   x : Integer ;
   y : Integer;
   Name : String;
   Datum : Date;
   ....
   bmp : TBitmap
end ;

type

Tmeinerecords = array of TmeinRecord


Type TMyClass= Class


          public

          somerecords : Tmeinerecords;
         
          ....
          procedure Berechne();
          procedure Berechne1Bild();

          .....
     end;


procedure TMyClass.Berechne1Bild( I : Integer; abmp . TBitmap);
begin
     ....

end;



procedure TMyClass.Berechne()
var i : Integer;
begin

  ///
  ///     ohne OTL , dieser Code geht
  ///

  for i := Low(somerecords) to High(somerecords) do
  begin

    somerecords[i].bmp := TBitmap.Create;
    try

      Berechne1Bild(i, somerecords[i].bmp);

    finally

    end;

  ///
  ///     mit OTL , dieser Code geht nicht
  ///
  Parallel.ForEach(0, High(somerecords)).Execute(
    procedure(const i: Integer)
    begin
      somerecords[i].bmp := TBitmap.Create;
      Berechne1Bild(i, somerecords[i].bmp);
    end );
end;

generic 21. Jul 2021 13:50

AW: List of Tbitmaps gleichzeitig bearbeiten
 
Man müsste sich mal den Inhalt von Berechne1Bild anschauen.
Globale Variablen?
VCL Objekte drin?
Nicht threadsafe Funktionen drin?

Wie wirkt sich "funktioniert nicht" aus?

Klaus01 21. Jul 2021 13:54

AW: List of Tbitmaps gleichzeitig bearbeiten
 
die laufvariable "i" ist möglicherweise nicht gesetzt.
Meines Wissens bietet ForEach keine Laufvariable an die genutzt werden könnte um i mit einem validen Wert zu belegen.


Das war mumpitz.

Delphi-Quellcode:
  Parallel.ForEach(0, High(somerecords)).Execute(
    procedure(const i: Integer)
    begin
      somerecords[i].bmp := TBitmap.Create;
      Berechne1Bild(i, somerecords[i].bmp);
    end );
Grüße
Klaus

jus 21. Jul 2021 13:56

AW: List of Tbitmaps gleichzeitig bearbeiten
 
Ich glaube, dass TBitmap nicht threadsafe ist. Es gibt noch so eine Hilfe mit CoInitialize oder so, hat bei mir zwar Verbesserungen gebracht, aber bei meinem letzten Vorhaben mit der OTL iVm. TBitmap habe ich es auch nicht 100% hingekriegt. Baue den CoInitialize mal bei dir ein, vielleicht hilft es bei dir. Letztendlich habe ich es letztes Mal so gelöst, dass ich das Bild in dem Thread mit TBitmap, das in dem Thread erzeugt wurde, bearbeitet und das Endergebnis in einem Stream geschrieben habe. Im Hauptthread habe ich den Stream wieder in TBitmap eingelesen. Aber genaueres können sicherlich hier im Forum ein paar Wissende es detailierter erklären. :wink:

Sinspin 25. Jul 2021 12:58

AW: List of Tbitmaps gleichzeitig bearbeiten
 
TBitmap ist hier vermutlich der Übeltäter. Wenn nicht irgendwas von TBitmap ganz dringend gebraucht wird würde ich darauf verzichten.

Ich verwende zum bearbeiten von Bildern in Threads eine ganz simple Klasse in der die Bilder als RGBA (32Bit) array stecken.

Wer alles braucht was man sich vorstellen kann sollte sich GR32 ansehen.


Alle Zeitangaben in WEZ +1. Es ist jetzt 12:39 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