[gelöst] Bitmap.FillRect in Thread führt zu Crash

Für Fragen von Einsteigern und Programmieranfängern...
Antworten
TerribleCode
Beiträge: 38
Registriert: Di 18. Nov 2014, 22:50
OS, Lazarus, FPC: Windows 7 [x64]; Lazarus 1.6.4 [i386-win32]; FPC 3.0.2 [win32 i386]
CPU-Target: 64Bit

[gelöst] Bitmap.FillRect in Thread führt zu Crash

Beitrag von TerribleCode »

Tag Leute,

Vorgeschichte:
ich habe ein Anwendung in der mehrere große Bilder geladen werden. Da sie allerdings nur quasi als verkleinerte Vorschau zu sehen sind, möchte ich nun die Bilder in einem Thread laden und in dem Thread dann ein kleines Thumbnail erstellen. Diese Thumbnails werden dann (hoffentlich) viel schneller vom UI-Prozess geladen und die Anwendung fühlt sich nicht so lahm an.

Problem:
PEBKAC. Spaß beiseite. Mein Programm stürzt immer ab oder hängt sich auf. Ganz selten scheint es auch mal funktioniert zu haben. Irgendetwas läuft also bei Bitmap.FillRect nicht so wie es soll. Wenn ich die Zeile 52 auskommentiere, dann läuft das Programm ohne Probleme. Ebenso funktioniert der Code wunderbar wenn ich ihn 1:1 vom Main-Thread ausführen lasse.

Was mache ich falsch? Wo ist der Fehler?
Ich bin für jeden Hinweis dankbar!

Liebe Grüße.
Dateianhänge
Beispielprojekt-ThreadBitmapFillRectCrash.zip
(2.53 KiB) 134-mal heruntergeladen
Zuletzt geändert von TerribleCode am Di 19. Feb 2019, 19:23, insgesamt 1-mal geändert.

sstvmaster
Beiträge: 576
Registriert: Sa 22. Okt 2016, 23:12
OS, Lazarus, FPC: W10, L 2.2.6
CPU-Target: 32+64bit
Wohnort: Dresden

Re: Bitmap.FillRect in Thread führt zu Crash

Beitrag von sstvmaster »

Theo hat eine Thumbnail Komponente geschrieben, vielleicht hilft dir das?

Thread dazu: https://www.lazarusforum.de/viewtopic.php?f=29&t=3929

Source: https://github.com/theo222/lazarus-thumbviewer
LG Maik

Windows 10,
- Lazarus 2.2.6 (stable) + fpc 3.2.2 (stable)
- Lazarus 2.2.7 (fixes) + fpc 3.3.1 (main/trunk)

Benutzeravatar
theo
Beiträge: 10497
Registriert: Mo 11. Sep 2006, 19:01

Re: Bitmap.FillRect in Thread führt zu Crash

Beitrag von theo »

TBitmap bzw. Canvas Zugriff ist generell nicht Threadsafe afaik.

Socke
Lazarusforum e. V.
Beiträge: 3158
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Bitmap.FillRect in Thread führt zu Crash

Beitrag von Socke »

theo hat geschrieben:TBitmap bzw. Canvas Zugriff ist generell nicht Threadsafe afaik.

Threadsafe kannst du die Klassen aus fcl-image verwenden; diese greifen nicht auf das Widgetset zu.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

TerribleCode
Beiträge: 38
Registriert: Di 18. Nov 2014, 22:50
OS, Lazarus, FPC: Windows 7 [x64]; Lazarus 1.6.4 [i386-win32]; FPC 3.0.2 [win32 i386]
CPU-Target: 64Bit

Canvas Zugriff sind offenbar nicht Threadsafe / Problem gelö

Beitrag von TerribleCode »

sstvmaster hat geschrieben:Theo hat eine Thumbnail Komponente geschrieben, vielleicht hilft dir das?

Scheint eine sehr mächtige Komponente zu sein. Leider kann ich mein Lazarus nicht neu kompilieren, lazarus.pp schmeißt mir immer einen fatalen Fehler. Das scheint aber ein Ubuntu-only Problem zu sein...
Auch wenn ich deinen Tipp zu schätzen weiß, wäre es mir doch lieber die Ursache zu finden, damit mir dieser Fehler in Zukunft nicht nochmal auf die Füße fällt.
Außerdem brauche ich von der ganzen Komponente nur einen sehr kleinen Teil, den ich mir dann lieber selbst programmiere. So lerne ich noch was dabei.

theo hat geschrieben:TBitmap bzw. Canvas Zugriff ist generell nicht Threadsafe afaik.

Also totaler Noob habe ich leider keine Ahnung was es heißt wenn etwas (nicht) Threadsafe ist, aber offenbar hast du Recht, denn:

Socke hat geschrieben:Threadsafe kannst du die Klassen aus fcl-image verwenden; diese greifen nicht auf das Widgetset zu.

Damit funktioniert es wunderbar. Vielen Dank Socke!

Antworten