AGB  ·  Datenschutz  ·  Impressum  







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

Create von Kompos und Schleifen

Ein Thema von Brainstalker · begonnen am 21. Sep 2005 · letzter Beitrag vom 27. Sep 2005
Antwort Antwort
Benutzerbild von Brainstalker
Brainstalker

Registriert seit: 9. Jan 2004
Ort: Berlin
176 Beiträge
 
Delphi 2009 Professional
 
#1

Create von Kompos und Schleifen

  Alt 21. Sep 2005, 21:32
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
Michael N.
Brainstalker
  Mit Zitat antworten Zitat
Benutzerbild von dizzy
dizzy

Registriert seit: 26. Nov 2003
Ort: Lünen
1.932 Beiträge
 
Delphi 7 Enterprise
 
#2

Re: Create von Kompos und Schleifen

  Alt 22. Sep 2005, 02:22
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 . Ist zwar nicht die feine englische Art dauernd Objekte neu zu erstellen und wieder freizugeben, aber ich wüsste keinen spontanen Workaround.

Gruss,
Fabian
Fabian K.
INSERT INTO HandVonFreundin SELECT * FROM Himmel
  Mit Zitat antworten Zitat
Benutzerbild von Brainstalker
Brainstalker

Registriert seit: 9. Jan 2004
Ort: Berlin
176 Beiträge
 
Delphi 2009 Professional
 
#3

Re: Create von Kompos und Schleifen

  Alt 22. Sep 2005, 15:40
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
Michael N.
Brainstalker
  Mit Zitat antworten Zitat
shmia

Registriert seit: 2. Mär 2004
5.508 Beiträge
 
Delphi 5 Professional
 
#4

Re: Create von Kompos und Schleifen

  Alt 22. Sep 2005, 15:54
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.
Andreas
  Mit Zitat antworten Zitat
Benutzerbild von Brainstalker
Brainstalker

Registriert seit: 9. Jan 2004
Ort: Berlin
176 Beiträge
 
Delphi 2009 Professional
 
#5

Re: Create von Kompos und Schleifen

  Alt 22. Sep 2005, 16:12
Stimmt hab ich noch gar nicht drüber nachgedacht, die anderen beiden werde ich auch nochmal testen. Danke für den Hinweis.
Michael N.
Brainstalker
  Mit Zitat antworten Zitat
Benutzerbild von Union
Union

Registriert seit: 18. Mär 2004
Ort: Luxembourg
3.487 Beiträge
 
Delphi 7 Enterprise
 
#6

Re: Create von Kompos und Schleifen

  Alt 22. Sep 2005, 17:16
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...
Ibi fas ubi proxima merces
sudo /Developer/Library/uninstall-devtools --mode=all
  Mit Zitat antworten Zitat
Benutzerbild von Brainstalker
Brainstalker

Registriert seit: 9. Jan 2004
Ort: Berlin
176 Beiträge
 
Delphi 2009 Professional
 
#7

Re: Create von Kompos und Schleifen

  Alt 27. Sep 2005, 19:35
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.
Michael N.
Brainstalker
  Mit Zitat antworten Zitat
Antwort Antwort


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 02: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