![]() |
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:
Der Code funktioniert im Hauptthread, aber nur selten im eigenen Thread ohne Fehler.
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; Folgender Code scheint auch im Thread zu funktionieren:
Delphi-Quellcode:
Jetzt möchte ich gerne wissen welche Vor- und Nachteile es bei den beiden Codes gibt.
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; 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 |
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 |
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 |
Re: Create von Kompos und Schleifen
Zitat:
Das macht 4 Varianten, von denen 2 getestet wurde. Bleiben noch 2 Varianten übrig: Bitmap innerhalb, Jpg ausserhalb und andersrum. |
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
|
Re: Create von Kompos und Schleifen
Also bei mir funktioniert folgender Code einwandfrei:
Delphi-Quellcode:
In c:\temp habe ich wahllos 13 Bitmaps mit einer Gesamtgröße von 1.5 MB kopiert...
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; |
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 09:17 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