Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Sonstige Fragen zu Delphi (https://www.delphipraxis.net/19-sonstige-fragen-zu-delphi/)
-   -   Delphi Create von Kompos und Schleifen (https://www.delphipraxis.net/53721-create-von-kompos-und-schleifen.html)

Brainstalker 21. Sep 2005 21:32


Create von Kompos und Schleifen
 
Da mein anderer Thread nicht zu dem gewünschten Ergebnis geführt hatte, erstelle ich einen neuen. In diesem versuche ich das Problem anders anzugehen und gleichzeitig Codefragen beantworten zu lassen.

In meinem anderen Thread ging es um ein Problem mit TThread und TJpegImage bzw. TBitmap. Also habe ich jetzt mal fragen zu folgendem Code:
Delphi-Quellcode:
var
  Bitmap: TBitmap;
  Jpg: TJpegImage;

begin
  Bitmap := TBitmap.Create;
  Jpg := TJpegImage.Create;

  for i := 0 to wasweißich do begin
    Bitmap.LoadFromFile...
    Jpg.Assign(Bitmap);
    Jpg.SaveToFile...
  end;

  Bitmap.Free;
  Jpg.Free;
Der Code funktioniert im Hauptthread, aber nur selten im eigenen Thread ohne Fehler.

Folgender Code scheint auch im Thread zu funktionieren:
Delphi-Quellcode:
var
  Bitmap: TBitmap;
  Jpg: TJpegImage;

begin
  for i := 0 to wasweißich do begin
    Bitmap := TBitmap.Create;
    Jpg := TJpegImage.Create;

    Bitmap.LoadFromFile...
    Jpg.Assign(Bitmap);
    Jpg.SaveToFile...

    Bitmap.Free;
    Jpg.Free;
  end;
Jetzt möchte ich gerne wissen welche Vor- und Nachteile es bei den beiden Codes gibt.
Welcher is programmiertechnich besser und welcher ist eher "dirty"?

Würd mich über Antworten freuen, da es mich zum einen so interessiert und möglicherweise eben auch mein Problem löst.

MfG
Brainstalker

dizzy 22. Sep 2005 02:22

Re: Create von Kompos und Schleifen
 
Jpeg und Threads... die Problematik kommt mir sehr bekannt vor - hatte ich vor einiger Zeit auch viel Last mit, und hab's letztlich aufgegeben, da das Programm nicht wirklich wichtig war.

Dass die 2. Variante besser klappt, könnte ich mir nur so erklären, dass evtl. TJPEGImage beim Assign und/oder Save GDI-Ressourcen anfordert, und nicht umgehend freigibt. Das wäre bei der 2. Version vermutlich über das Free erzwungen. (Das würde u.U. deine OutOfRessources Fehler im anderen Thread erklären.)
Was mir dabei jedoch schleierhaft ist: Warum tritt das nicht im Mainthread auf? Ich weiss nicht mehr wer es war, aber ich habe mal die Vermutung gelesen, dass die GDI in Teilen per se nicht Threadsafe ist, und es so zu Problemchen kommen könnte.
Irgendwie schwirrt mir etwas von "Unit Jpeg scheint nicht Threadsafe zu sein" im Kopf rum. Zwei mögliche Ansätze: Versuchen eine andere jpeg-lib zu bekommen (nicht einfach - ich habe keine brauchbare gefunden), oder aber die Teile mit jpegs synchronisieren :?. Bzw. wenn dein obiger (2.) Code geht, nimm ihn einfach :D. Ist zwar nicht die feine englische Art dauernd Objekte neu zu erstellen und wieder freizugeben, aber ich wüsste keinen spontanen Workaround.

Gruss,
Fabian

Brainstalker 22. Sep 2005 15:40

Re: Create von Kompos und Schleifen
 
Ja das mit den Problemen merke ich auch langsam.

Ich werde erstmal Variante 2 benutzen und hoffe das ich das Problem bis zur fertigstellung lösen kann. Wenn nicht muss es auf unbestimmte Zeit so bleiben auch wenns nicht gut ist.
Das mit dem Synchronisieren werde ich mal versuchen aber auf keinen Fall in meinem Projekt benutzen, da sonst mein Code wie sonstwas aussieht und ein Großteil dann wieder im Hauptthread ist.
Von irgendlwechen Problemen wegen Threadsicher und nicht hatte ich auch mal gelesen. Werde auf jeden Fall nach einer anderen Kompo/Unit ausschau halten.
Bin im Moment ein bisschen verzweifelt, will halt deswegen nicht mein Ganzes Programm hinschmeißen.
Danke für die Hinweise.

MfG Brainstalker

shmia 22. Sep 2005 15:54

Re: Create von Kompos und Schleifen
 
Zitat:

Zitat von Brainstalker
Ich werde erstmal Variante 2 benutzen und hoffe das ich das Problem bis zur fertigstellung lösen kann. Wenn nicht muss es auf unbestimmte Zeit so bleiben auch wenns nicht gut ist.

Es sind ja 2 Objekte: Bitmap & Jpg, die innerhalb oder ausserhalb der inneren Schleife erzeugt und zerstört werden können.
Das macht 4 Varianten, von denen 2 getestet wurde. Bleiben noch 2 Varianten übrig:
Bitmap innerhalb, Jpg ausserhalb und andersrum.

Brainstalker 22. Sep 2005 16:12

Re: Create von Kompos und Schleifen
 
Stimmt hab ich noch gar nicht drüber nachgedacht, die anderen beiden werde ich auch nochmal testen. Danke für den Hinweis. :-D

Union 22. Sep 2005 17:16

Re: Create von Kompos und Schleifen
 
Also bei mir funktioniert folgender Code einwandfrei:
Delphi-Quellcode:
procedure TMyThread.Execute;
var
   bmp : TBitmap;
   jpg : TJPEGImage;
   sr : TSearchRec;
begin
   if FindFirst('c:\temp\*.bmp', faAnyFile, sr) = 0 then
   begin
      bmp := TBitMap.Create;
      try
         jpg := TJPEGImage.Create;
         try

            repeat
               Filename := 'c:\temp\'+sr.Name;
               bmp.LoadFromFile(FileName);
               jpg.Assign(bmp);
               jpg.SaveToFile(ChangeFileExt(FileName, '.jpg'));
            until FindNext(sr) <> 0;

         finally
            jpg.Free;
         end;
      finally
         bmp.free;
      end;
   end;
end;
In c:\temp habe ich wahllos 13 Bitmaps mit einer Gesamtgröße von 1.5 MB kopiert...

Brainstalker 27. Sep 2005 19:35

Re: Create von Kompos und Schleifen
 
So habs jetzt ausprobiert. Es scheint nicht am TJpegImage zu liegen sondern am TBitmap. Anscheinend gibt es da funktionen die nicht Threadsicher sind, da es im Hauptthread ja funktioniert. Muss das ganze noch mal ein bisschen genauer unter die Lupe nehmen.
Mein Jpeg lass ich außerhalb der Schleife Create'n und Free'n und mein Bitmap innerhalb der Schleife, solange ich den Fehler nicht gefunden habe. Also ist der Code nur halb "dirty".

@Union
Der Code von mir war ein kleines bisschen verkürzt. Aber danke fürs testen. Daher weiß ich jetzt auch das es nicht am TJpeg sondern am TBitmap liegen muss.


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