Delphi-PRAXiS

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi Thread.suspend gesetzt und trotzdem Zugriffsfehler (https://www.delphipraxis.net/56862-thread-suspend-gesetzt-und-trotzdem-zugriffsfehler.html)

Pfoto 12. Nov 2005 14:36


Thread.suspend gesetzt und trotzdem Zugriffsfehler
 
:hi: zusammen,

ich habe aktuell ein Problem das ich nicht in den Griff bekomme:
Ein Thread bearbeitet im Hintergrund Bilder und speichert diese als Thumbnails ab.
Im Vordergrund greife ich auf diese Thumbnails zu.

Ich ging davon aus, dass ich mit Thread.suspend den Thread sofort anhalten könne, um dann im Vordergrund das Thumbnail zu laden.
Also etwa so:
Delphi-Quellcode:
Thread.suspend;
// Im Vordergrund Thumbnail laden
Image1.Picture.LoadFromFile(Dateiname);
// Dann im Hintergrund weiter neue Thumbnails erstellen etc...
Thread.resume;
Trotzdem kommt eine Fehlermeldung, dass bereits ein Zugriff vorliegt. Also ist der Thread doch noch aktiv? Hält der Thread mit suspend nicht sofort und vollständig an oder führt er noch die aktuelle Methode zuende aus?

Das Speichern des Thumbnails im Thread mit Synchronize durchführen, wäre doch auch ein Flaschenhals und würde die Anwendung andauernd abbremsen.

Vielleicht gibt es ja auch etwas sinnvolleres, was ich machen sollte.
Was meint ihr? :gruebel:


Dank und Gruß
Pfoto

Khabarakh 12. Nov 2005 14:42

Re: Thread.suspend gesetzt und trotzdem Zugriffsfehler
 
Habe ich es richtig verstanden, dass du in einem Thread Bilddateien erstellst und diese im Hauptthread wieder lädst? Wäre es da nicht schlauer, das Bitmap von Thread zu VCL-Thread zu übergeben?

Zu dem Problem an sich: Der Thread scheint wohl die Datei gerade geöffnet zu haben, wenn du ihn anhälst.

Der_Unwissende 12. Nov 2005 14:45

Re: Thread.suspend gesetzt und trotzdem Zugriffsfehler
 
Erstmal unabhängig vom Suspend, was genau macht denn der Thread?
Ich meine wenn du die Datei öffnest und damit implizit eine Sperre setzt, dann wird diese Sperre doch erst gelöst, wenn der Thread sie wieder freigibt (wahrscheinlich erst wenn er beendet wird). Wenn du also den Thread anhälst, dann arbeitet er zwar nicht auf dem Bild, aber die Sperre bleibt erhalten.
Also führt ein Laden zu deinem Fehler bis die Sperre nicht mehr existiert.

Gruß Der Unwissende

Pfoto 12. Nov 2005 15:23

Re: Thread.suspend gesetzt und trotzdem Zugriffsfehler
 
Zitat:

Zitat von Khabarakh
Wäre es da nicht schlauer, das Bitmap von Thread zu VCL-Thread zu übergeben?

Im Hintergrund werden Bilddateien einer Datenbank der Reihe nach abgearbeitet. (Die Bilddateien werden aber nicht in der DB gespeichert)
Es ist also nicht gesagt, dass die gerade bearbeitete Datei auch im Hauptprogramm angezeigt werden muss, sondern nur wenn der User zufällig diese in seiner Liste scrollt.

Der Thread läuft praktisch permanent im Hintergrund und wird nicht erst bei Bedarf erzeugt. Die Sperre (also das Anhalten) wird deswegen im Hauptprogramm erzeugt und sofort nach dem laden des kleinen Thumbnails in die Liste wieder aufgehoben.

Es ist auch nicht so, dass das Programm dauernd abstürzt, sondern (scheinbar) nur exakt wenn sich Lade- und Speichervorgang überkreuzen (was ich ja verhindern wollte)


Gruß
Pfoto

Luckie 12. Nov 2005 16:58

Re: Thread.suspend gesetzt und trotzdem Zugriffsfehler
 
Du solltest dies über die Synchronize Methode von TThread regeln.


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