AGB  ·  Datenschutz  ·  Impressum  







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

Thread mit komischem Verhalten

Ein Thema von Schwedenbitter · begonnen am 19. Jan 2016 · letzter Beitrag vom 19. Jan 2016
Antwort Antwort
Seite 1 von 2  1 2      
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#1

Thread mit komischem Verhalten

  Alt 19. Jan 2016, 00:00
Delphi-Version: XE5
Hallo,

ich versuche, die Kompression von Bitmaps (nach PNG bzw. JPG) in einen Thread auszulagern. Den entsprechenden Code habe ich angehängt.
Das komische daran ist, dass die Ausgabe der fertigen Dateien perfekt funktioniert, wenn ich mit {$DEFINE DebugUnit} bestimmten Code mit ausführen lassen. Es handelt sich dabei um eine "LOG-Datei", die mir die Dateinamen der Quelldateien ausgibt. Das ganze realisiere ich über eine TStingList .

Wird dieser Code nicht mit compiliert, funktioniert es plötzlich nicht mehr - also es werden keine Ausgabe-Dateien in Form von PNG bzw. JPG.

Im Moment bin ich sehr ratlos und würde mich freuen, wenn mir jemand sagen kann, woran es liegt.

Gruß, Alex
Angehängte Dateien
Dateityp: pas WorkThread.pas (3,9 KB, 8x aufgerufen)
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#2

AW: Thread mit komischem Verhalten

  Alt 19. Jan 2016, 00:31
Da kann ich dir helfen:

Jedes Mal, wenn du Delphi, Bitmap und Thread in einem Satz sagst, streichst du diesen Satz (bis auf Weiteres) wieder aus deinem Gedächtnis

Du kannst fast alles im Thread machen, aber Bitmaps (VCL/FMX) gehen nicht!

Marco Cantù
In general, bitmap operations in background threads have never been allowed, although they do occasionally work.
https://community.embarcadero.com/fo...ng-in-xe8#1984
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)

Geändert von Sir Rufo (19. Jan 2016 um 00:36 Uhr)
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#3

AW: Thread mit komischem Verhalten [Bild-Kompression]

  Alt 19. Jan 2016, 00:48
Du kannst fast alles im Thread machen, aber Bitmaps (VCL/FMX) gehen nicht!
Danke erstmal für die Antwort. Das nehme ich so zur Kenntnis und gräme mich! Dass ich keine Operationen auf dem Canvas machen soll, habe ich schon so gelesen und daher in mein Hauptprogramm/-thread realisiert.

Allerdings ist die Umwandlung von zig BMP in JPG und insbesondere von PNG nicht ein einem Hauptprogramm für den Benutzer erträglich machbar. Da käme mir einzig die Idee, ein weiteres kleine Programm zu schreiben, was im Hintergrund läuft und dessen Resourcen vom BS zugeteilt werden. Ich fände das aber keine schöne Lösung.
Wenn ich die Antwort sklavisch lese, gehen also "nur" VCL/FMX nicht; GDI+ evtl. dagegen schon. Letzteres ist aber so kompliziert, dass ich davon schon seit langem wieder die Finger gelassen habe.

Wie macht man es dann möglichst einfach und für Laien wie mich handhabbar?
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#4

AW: Thread mit komischem Verhalten

  Alt 19. Jan 2016, 01:16
Sehe gerade, dass du wohl ein VCL-Programm schreibst.

Dann kannst du Bitmap32 von graphics32.org nehmen. Die gehen auch im Thread
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

AW: Thread mit komischem Verhalten

  Alt 19. Jan 2016, 03:19
Nur um Klarheit zu bekommen. Man kann kein Bitmap-Objekt in einem Thread außer dem Hauptthread erstellen?
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
Medium

Registriert seit: 23. Jan 2008
3.686 Beiträge
 
Delphi 2007 Enterprise
 
#6

AW: Thread mit komischem Verhalten

  Alt 19. Jan 2016, 03:32
Bisher, bei den Dingen die ich bisher so in Threads gemacht habe, und Bitmaps waren dabei, war es eigentlich immer so, dass Ressourcen die ich in einem Thread-Kontext nutzen will, diese auch dort erzeugt werden müssen. Das heisst insbesondere bei der Delphi-RTL-Implementierung "TThread": Etwas, was im Konstruktor erzeugt wird, ist NICHT im Thread-Kontext, sonderm im Hauptthread erzeugt. Nur Dinge die in der Execute-Methode erstellt werden sind auch wirklich im Thread-Kontext, und gerade bei so manchen Systemressourcen, und insbesondere bei GDI-Zeug scheint das recht wichtig zu sein. (Ich habe mir den Code jetzt nicht angeschaut um zu wissen ob das hier zutrifft, ich sollte eigentlich schleunigst ins Bett.) Und so lange man ein Bitmap in Thread-Kontext im selben Kontext auf die Platte schreibt, und nicht etwa noch fix auf einem Formular darstellen will, muss man sich imho nichtmals um irgendwelche Synchronisierungen kümmern.
Meine Erfahrungen decken sich hier nicht mit Marcos Aussage.
"When one person suffers from a delusion, it is called insanity. When a million people suffer from a delusion, it is called religion." (Richard Dawkins)
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#7

AW: Thread mit komischem Verhalten

  Alt 19. Jan 2016, 06:35
Bisher (...) war es eigentlich immer so, dass Ressourcen die ich in einem Thread-Kontext nutzen will, diese auch dort erzeugt werden müssen. (...) Nur Dinge die in der Execute-Methode erstellt werden sind auch wirklich im Thread-Kontext, und gerade bei so manchen Systemressourcen, und insbesondere bei GDI-Zeug scheint das recht wichtig zu sein. (...) Und so lange man ein Bitmap in Thread-Kontext im selben Kontext auf die Platte schreibt, und nicht etwa noch fix auf einem Formular darstellen will, muss man sich imho nichtmals um irgendwelche Synchronisierungen kümmern. (...)
Den Code hatte ich im ersten Post angehängt.
Aus diesen Gründe läuft es im Prinzip so, dass das Hauptprogramm die Bitmaps als Dateien im Temp-Verzeichnis ablegt. Dem Thread übergebe ich jeweils nur den Dateinamen als String.
In Execute erzeuge ich dann in jeder Schleife ein Bitmap. Verkürzt sieht das so aus:
Delphi-Quellcode:
Procedure TWorkThread.Execute;
Var
   I : Integer;
   aBMP : TBitmap;
Begin
   While (Not Terminted) Do
   Begin
      For I:=0 To Pred(Length(fArray)) Do
      Begin
         If (Not fArray[I].Done) Then
         Begin
            fArray[I].Done:= True;
            aBMP:= TBitmap.Create;
            Try
               aBMP.LoadFromFile(fArray[I].FileName);
               With TPngImage.Create Do
               Try
                  Assign(aBMP); // Bild übernehmen
                  SaveToFile(fArray[I].DestName);
               Finally
                  Free;
               End;
            Finally
               aBMP.Free;
            End;
         End;
      End;
   End;
End;
Alex Winzer

Geändert von Schwedenbitter (19. Jan 2016 um 06:40 Uhr)
  Mit Zitat antworten Zitat
Schwedenbitter

Registriert seit: 22. Mär 2003
Ort: Finsterwalde
622 Beiträge
 
Turbo Delphi für Win32
 
#8

AW: Thread mit komischem Verhalten

  Alt 19. Jan 2016, 07:38
Danke nochmal für die zahlreichen Antworten.
Nur um Klarheit zu bekommen. Man kann kein Bitmap-Objekt in einem Thread außer dem Hauptthread erstellen?
Das kann ich mir nicht vorstellen. Anderenfalls wäre zu erwarten gewesen, dass im Hilfetext zumindest irgend ein Sterbenswörtchen zu lesen wäre. Ist es aber nicht. Nichtsdestotrotz werde ich mir mal graphics32.org ansehen. Am Ende ist mir wichtig, dass es irgendwie funktioniert und nicht warum - leider.
Alex Winzer
  Mit Zitat antworten Zitat
Benutzerbild von Sir Rufo
Sir Rufo

Registriert seit: 5. Jan 2005
Ort: Stadthagen
9.454 Beiträge
 
Delphi 10 Seattle Enterprise
 
#9

AW: Thread mit komischem Verhalten

  Alt 19. Jan 2016, 10:05
@Medium

Das Problem hängt mit der Koppelung zwischen TBitmap und TCanvas zusammen. Der Canvas selber wird allerdings lazy erstellt (was manchmal selbst zu seltsamen Ergebnissen führt, die sich durch ein einfaches myBitmap.Canvas; lösen können.

TCanvas ist nicht thread-safe und kann auch nicht thread-safe verwendet werden (intern gibt es da globale Abhängigkeiten) und darum ist TBitmap nicht thread-safe.

Was allerdings nicht heißt, dass es keine Anwendungen gibt, die ein TBitmap in einem Thread verwursten und es sogar funktioniert. Die haben einfach nur Glück wenn es funktioniert. Diese "race conditions" tauchen auf, wenn sie wollen und nicht wenn man es von ihnen erwartet
Kaum macht man's richtig - schon funktioniert's
Zertifikat: Sir Rufo (Fingerprint: ‎ea 0a 4c 14 0d b6 3a a4 c1 c5 b9 dc 90 9d f0 e9 de 13 da 60)
  Mit Zitat antworten Zitat
Der schöne Günther

Registriert seit: 6. Mär 2013
6.176 Beiträge
 
Delphi 10 Seattle Enterprise
 
#10

AW: Thread mit komischem Verhalten

  Alt 19. Jan 2016, 10:13
Das kann ich mir nicht vorstellen. Anderenfalls wäre zu erwarten gewesen, dass im Hilfetext zumindest irgend ein Sterbenswörtchen zu lesen wäre. Ist es aber nicht.
Genau darüber habe ich mich neulich auch gewundert:

War mir persönlich auch vollkommen neu. Haben wir alle die Doku nicht richtig gelesen oder steht das da schlichtweg nicht drin?
Siehe: http://www.delphipraxis.net/186810-t...ml#post1317616
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


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 00:34 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