![]() |
Wie kann man TThread synchronize ausbauen ?
Liste der Anhänge anzeigen (Anzahl: 1)
Hallo,
Ich habe hier ein Kleines Programm geschrieben das hergeht und in einem Thread ein JPG File in OpenGL laden soll. Das Problem ist das das nur geht wenn ich in dem Thread die Laderoutine mit Synchronize aufrufe. Das aber macht dann den ganzen Sinn des Threads kaputt, da ich ja schlieslich im Hintergrund das Bild LAden will und meine Anwendung nicht Mit dem Laden blockieren soll. Anbei habe ich euch das Ganze Programm mal hochgeladen so könnt ihr den Fehler ansehen. |
Re: Wie kann man TThread synchronize ausbauen ?
Soweit ich weiß, sollte man in nem Extra-Thread nicht an der GUI rumfummeln... Kann übel ausgehen.
|
Re: Wie kann man TThread synchronize ausbauen ?
Ich Fummle ja nicht an der Gui Rum.
Ich will lediglich aus nem Tmemorystream ein JPG File in eine OpenGL Variable Laden. und das eben in einem Thread. Ein Kumpel meinte das es wohl nur daran Liegt das in Zeile 237 von Textures.pas
Delphi-Quellcode:
steht und das eine VCL anweisung sei.
BMP.canvas.draw(0, 0, JPG);
|
Re: Wie kann man TThread synchronize ausbauen ?
Was hälst denn davon?
Delphi-Quellcode:
Nur die referenz auf Form1 sollte man noch überdenken.
Tloader = Class(TThread)
public Procedure Execute; override; Constructor Create; private m:Tmemorystream; procedure tosync; End; //... Procedure TILoeader.tosync; Begin LoadTextureStream(m, {form1.}img); End; Procedure Tloader.Execute; var f:Tfilestream; Begin f := Tfilestream.create('Test.jpg', fmopenread); m := Tmemorystream.create; m.CopyFrom(f, f.size); m.position := 0; Synchronize(tosync); m.free; f.ree; End; |
Re: Wie kann man TThread synchronize ausbauen ?
Also um es Klar aus zu drücken.
Es Bringt nichts. Wie euch sicherlich Klar ist mache ich das ja in einer total anderen Anwendung, und da sind die jpg Dateien natürlich deutlich Größer , aber selbst in dem Sample hier ist es schon so das wenn ich eine entsprechend Große Datei Lade es nicht mehr Geht. |
Re: Wie kann man TThread synchronize ausbauen ?
Ich hab mal kurz weiter reingesehen. Ich vermute das Problem kommt erst bei createtextures (bzw. spätestens da) Das BMP ist liegt irgendwo frei im Speicher und hat mit dem Hauptthread nix zu tun. Aber createtextures benutzt min eine paar gl-Funktionen und vor allem globale Variablen..
|
Re: Wie kann man TThread synchronize ausbauen ?
Also ,
Ich hab das mal nun Zerhackstückelt und in Ettliche Globale Variablen Ausgelagert. dann geschaut was per synchronize gemacht werden mus und was nicht. Und Sirius hat recht. Die Function CreateTexture ist das Problem diese habe ich mit Synchronize gemacht und schwups gehts. Und da diese Function zum Glück sehr schnell ist kann ich es so lassen. Danke für die schnelle Hilfe. |
Re: Wie kann man TThread synchronize ausbauen ?
Natürlich bastelst du an der GUI rum. Nämlich genau damit, was du da oben geschrieben hast: In einem Nicht-Hauptthread auf die GUI zeichnen ist einfach BÖSE BÖSE BÖSE. Hab ich in meinem vorherigen Beitrag doch gesagt.
|
Alle Zeitangaben in WEZ +1. Es ist jetzt 00:58 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 by Thomas Breitkreuz