Delphi-PRAXiS
Seite 3 von 4     123 4      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Threadübergreifende Bitmap (https://www.delphipraxis.net/186810-threaduebergreifende-bitmap.html)

Der schöne Günther 2. Okt 2015 16:06

AW: Threadübergreifende Bitmap
 
Ich habe selber auch grade so etwas probiert, bekomme ständig "Out of resources". Siehe auch hier:
http://www.delphipraxis.net/108000-t...tml#post735086

Ohne im Quelltext zu wühlen, dafür aber die Suchmaschine meines Vertrauens zu befragen, sieht es (zumindest für Laien wie mich) wirklich danach aus, als könnte man mit Vcl.Graphics.TBitmap nur im Hauptthread arbeiten? :|

Bernhard Geyer 2. Okt 2015 16:14

AW: Threadübergreifende Bitmap
 
Zitat:

Zitat von FirstTry (Beitrag 1317529)
Habe den Link gefunden
Code:
http://www.snehovapohotovost.cz/authorsmore.php?id=6929
Also liegt der Fehler in der Verarbeitung von WindowsHandles?
Es kann doch nicht sein, dass mein Fehler nicht "normal" lösbar ist... Sicher dass es am Bitmap liegt?
Könnte es anstatt mit Synchronize mit irgendetwas anderem klappen?

Es ist meine Vermutung das es hieran liegt. Und wenn es daran liegt dann muss man halt den (aufwändigeren) Weg gehen und keine Win32-GDI-Ressourcen über Threadgrenzen hinweg zu verwenden.

Dejan Vu 3. Okt 2015 07:20

AW: Threadübergreifende Bitmap
 
Also ich habe in die While-not-terminated-Schleife ein Sleep eingebaut und die Instantiierung des Bitmaps in den Konstruktor des Threads verlagert. Klappt.

Bernhard Geyer 3. Okt 2015 08:16

AW: Threadübergreifende Bitmap
 
Zitat:

Zitat von Dejan Vu (Beitrag 1317556)
Also ich habe in die While-not-terminated-Schleife ein Sleep eingebaut und die Instantiierung des Bitmaps in den Konstruktor des Threads verlagert. Klappt.

Im Konstruktor des Threads bist du ja noch im Hauptthread und noch nicht im Thread-Thread.

Sir Rufo 3. Okt 2015 08:39

AW: Threadübergreifende Bitmap
 
Nur das Sleep verbessert die Situation. Die Bitmap Instanz kann man erzeugen wo man möchte.

Problematisch ist nicht
Delphi-Quellcode:
TBitmap
an sich, sondern
Delphi-Quellcode:
TBitmap.Canvas
. Da wird intern etwas Globales verwendet und das fällt einem auf die Füße.

Ein
Delphi-Quellcode:
TCanvas.Lock
/
Delphi-Quellcode:
TCanvas.Unlock
sollte eigentlich helfen, aber leider auch nur bedingt. Irgendwann kommt man in einen Deadlock, wenn das zu schnell von unterschiedlichen Threads erfolgt.

Darum bringt die Verwendung von
Delphi-Quellcode:
Sleep
eine Verbesserung.

Wenn man eine echte Lösung haben möchte, dann sollte man
Delphi-Quellcode:
TBitmap
im Thread vergessen und dort auf
Delphi-Quellcode:
TBitmap32
von Graphics32 setzen.

Zu dieser Erkenntnis kommt man auch hier: How threadsafe is TBitmap

Bernhard Geyer 3. Okt 2015 10:59

AW: Threadübergreifende Bitmap
 
Zitat:

Zitat von Sir Rufo (Beitrag 1317561)
Problematisch ist nicht
Delphi-Quellcode:
TBitmap
an sich, sondern
Delphi-Quellcode:
TBitmap.Canvas
. Da wird intern etwas Globales verwendet und das fällt einem auf die Füße.

Das dieses Canvas ein Integrales Bestandteil von TBitmap ist sehe ich diese Trennung als Spitzfindigkeit.
Aber was solls mit TBitmap32 oder TPngImage gibts genügend Alternativen.

Sir Rufo 3. Okt 2015 11:06

AW: Threadübergreifende Bitmap
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1317569)
Zitat:

Zitat von Sir Rufo (Beitrag 1317561)
Problematisch ist nicht
Delphi-Quellcode:
TBitmap
an sich, sondern
Delphi-Quellcode:
TBitmap.Canvas
. Da wird intern etwas Globales verwendet und das fällt einem auf die Füße.

Das dieses Canvas ein Integrales Bestandteil von TBitmap ist sehe ich diese Trennung als Spitzfindigkeit.
Aber was solls mit TBitmap32 oder TPngImage gibts genügend Alternativen.

Nicht wirklich, denn es ist absolut safe z.B. mit
Delphi-Quellcode:
TBitmap.Scanline
oder
Delphi-Quellcode:
TBitmap.Pixels
zu arbeiten (was über Scanline geht).

Dejan Vu 3. Okt 2015 13:20

AW: Threadübergreifende Bitmap
 
Zitat:

Zitat von Sir Rufo (Beitrag 1317561)
Nur das Sleep verbessert die Situation. Die Bitmap Instanz kann man erzeugen wo man möchte.

Das stimmt nicht. Erst, als die Bitmap im Konstruktor erzeugt wurde, funktionierte es.

Sir Rufo 3. Okt 2015 13:29

AW: Threadübergreifende Bitmap
 
Zitat:

Zitat von Dejan Vu (Beitrag 1317579)
Zitat:

Zitat von Sir Rufo (Beitrag 1317561)
Nur das Sleep verbessert die Situation. Die Bitmap Instanz kann man erzeugen wo man möchte.

Das stimmt nicht. Erst, als die Bitmap im Konstruktor erzeugt wurde, funktionierte es.

Ich habe es mit DX Seattle ausprobiert und da braucht es nur das Sleep (um augenscheinlich stabil zu laufen).

Da aber Thread und
Delphi-Quellcode:
TBitmap
nicht so richtig zusammen passen, sollte man das getrost mit einem Sperrvermerk belegen und im Thread auf eine der genannten Alternativen setzen. Ein Sleep in einem Thread ist eher Makulatur und keine stabile Grundlage. Das ist nur legitim um solche Timingprobleme zu lokalisieren.

Mavarik 3. Okt 2015 13:38

AW: Threadübergreifende Bitmap
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1317510)
Zitat:

Zitat von Mavarik (Beitrag 1317505)
OK...
Schon funktioniert es!

Zufälligerweise.
Jedes Zeichnen aus dem Thread auf im Hauptprogramm erzeugte Formulare kracht früher oder später.

Deswegen ruft man ja Syncronize auf...


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:52 Uhr.
Seite 3 von 4     123 4      

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