Delphi-PRAXiS

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)

FirstTry 1. Okt 2015 22:19

Delphi-Version: 5

Threadübergreifende Bitmap
 
Liste der Anhänge anzeigen (Anzahl: 1)
Guten Tag,

Folgendes Problem:
1. Thread: GUI und erstellung des 2 Threads.
Besitzt eine Bitmap B, die regelmäßig auf eine Paintbox auf der Form gezeichnet wird
2. Thread: Malt die aktuelle Uhrzeit auf eine Bitmap C und malt die Bitmap C synchonisiert auf B.

Problem dabei: drücke ich auf start, sehe ich die Zeit so laufen wie sie soll. Bewege ich aber die Maus über die Form, so bleibt die Zeit stehen (nicht der Thread, wurde getestet).

Wieso läuft es dann nicht normal weiter?
Ebenso steigt der benötigte Arbeitsspeicher exponentiell an wenn die Maus sich über der Form befindet.

Einen solchen Fehler hatte ich noch nie :?

Deshalb bitte ich euch um Hilfe
mit freundlichen Grüßen
FirstTry

P.S: Datei mit Quellcode (kompiliert unter Delphi 7 PE )ist im Anhang

Das Problem ist schon auf das notwendigste reduziert.

hathor 1. Okt 2015 23:13

AW: Threadübergreifende Bitmap
 
Das Programm verstehe ich nicht.
Um nur eine Uhrzeit anzuzeigen, muss man das nicht auf die umständlichste Art tun.

Delphi-Quellcode:
while not Terminated do
  begin
  aBild.Canvas.TextOut( 100, 100, FormatDateTime('hh:nn:ss.zzz', Now) );
  //aktualisiere Daten
  Synchronize( Zeichne );
  Sleep(20); // <----------------------
  end;

FirstTry 1. Okt 2015 23:46

AW: Threadübergreifende Bitmap
 
Vielen Dank für deine Antwort!
Synchronize ist also nicht blockierend, ist das das Problem ?!

Es geht hier nicht um die Uhrzeit, aber zur Vereinfachung des Problems auf das Wesentliche habe ich versucht ein Testprojekt zu schreiben, indem der Fehler den ich meine Sichtbar wird.

Bei sleep(20) hält er trotzdem noch manchmal an... wielange muss ich denn warten? kann ich WaitFor oder sonst etwas verwenden, um genau die notwendige Zeit zu warten?

Namenloser 1. Okt 2015 23:52

AW: Threadübergreifende Bitmap
 
Hallo FirstTry, Willkommen in der DP.

Zitat:

Zitat von FirstTry (Beitrag 1317427)
drücke ich auf start, sehe ich die Zeit so laufen wie sie soll. Bewege ich aber die Maus über die Form, so bleibt die Zeit stehen (nicht der Thread, wurde getestet).

Vorweg: Ich habe das angehängte Programm nicht ausgeführt, sondern mir nur den Code angeschaut.

Danach wundert es mich eigentlich mehr, dass es am Anfang, bevor du die Maus über die Paintbox bewegst, laut deiner Aussage noch funktioneren soll. Denn du updatest zwar das TBitmap im Speicher (FBild), aber ich kann in deinem Code nirgends eine Stelle finden, in der du ein Neuzeichnen der Paintbox veranlasst. Somit wird das Bitmap zwar fleißig aktualisiert, aber vergammelt dann im Speicher, ohne dass du es jemals zu Gesicht bekommst.

Dass der Speicherverbrauch explodiert, kann ich auch nicht nachvollziehen. Grundsätzlich können solche Dinge schon passieren, wenn man auf GDI-Objekte wie TBitmap oder TCanvas fälschlicherweise mit mehreren Threads parallel zugreift. Aber da du Synchronize verwendest, sollte es hier eigentlich zu keinen Problemen kommen.

Hast du das Problem wirklich mit dem Projekt, so wie du es angehängt hast, reproduziert?

Zitat:

Zitat von FirstTry (Beitrag 1317436)
Synchronize ist also nicht blockierend, ist das das Problem ?!

Eigentlich müsste Synchronize blockieren.

Bitte nicht irgendwas mit Sleep hinfrickeln! Selbst wenn es für eine Zeit lang zu funktionieren scheint, irgendwann fliegt es dir dafür so richtig um die Ohren.

FirstTry 2. Okt 2015 00:09

AW: Threadübergreifende Bitmap
 
Zitat:

Zitat von Namenloser (Beitrag 1317437)
Danach wundert es mich eigentlich mehr, dass es am Anfang, bevor du die Maus über die Paintbox bewegst, laut deiner Aussage noch funktioneren soll.
Hast du das Problem wirklich mit dem Projekt, so wie du es angehängt hast, reproduziert?

Ja damit habe ich den Fehler reproduziert! Ich habe auf der Form einen Timer, der die OnPaint Methode der Paintbox alle 10ms aufruft.

Zitat:

Zitat von Namenloser (Beitrag 1317437)
Eigentlich müsste Synchronize blockieren.

Bitte nicht irgendwas mit Sleep hinfrickeln! Selbst wenn es für eine Zeit lang zu funktionieren scheint, irgendwann fliegt es dir dafür so richtig um die Ohren.

Scheinbar nicht... Deshalb fragte ich nach etwas anderem :wink:

Luckie 2. Okt 2015 00:19

AW: Threadübergreifende Bitmap
 
Ohne genaue Diagnose, sondern nur aus der Erfahrung und meinem bescheidenen Wissen:

Der Speicher explodiert, weil du immer das Bitmap neu erzeugst, aber nicht wieder frei gibst.

Das Programm "hakt" weil es die Mouse-Messages abarbeitet und somit nicht den Programmcode oder sonstige Eingaben abarbeiten kann. Beispiel: Fenster an der Titelleiste "anfassen" und wild hin und her schieben. Es wird nichts machen, weil es nur mit dem Neu-Zeichen beschäftigt ist.

Ok. Mein Wissen beruht noch auf Windows XP. Microsoft hat ab Vista ziemlich was am Fenstermanager gedreht. Aber wenn man wie unter XP programmiert, sollte man auf der sicheren Seite sein.

FirstTry 2. Okt 2015 00:26

AW: Threadübergreifende Bitmap
 
Danke Luckie für deinen Beitrag.
Allerdings bin ich mir nicht sicher ob du überhaupt einen Blick in den Code geworfen hast.

1. Das Bitmap wird nur 1mal erzeugt
2. Steigt der Speicher nur wenn die Maus über der Form ist
3. Verarbeite ich die Mausbewegung nichteinmal (nur die normalen Windows Events, kein Code von mir)

Wie programmiert man denn unter XP? :?:

Luckie 2. Okt 2015 00:39

AW: Threadübergreifende Bitmap
 
Öhm. Nein. Habe keine Blick drauf geworfen. Habe die angehängte Datei nicht gesehen.

Wie man unter XP die grafischen Sachen programmiert? XP zeichnet nur das auf dem Desktop, was man auch sieht. Vista und höher speichern das irgendwie im Hintergrund, was auf dem Desktop gezeichnet werden soll.

FirstTry 2. Okt 2015 12:18

AW: Threadübergreifende Bitmap
 
Guten Tag,

Es kommt teilweise der Fehler: 'Leinwand/Bild erlaubt kein Zeichnen'
Vielleicht wird zu schnell gemalt oder zu oft..

Ich weiß leider immer noch nicht, wo der Fehler genau steckt. Scheinbar im Synchronize, aber auch ein Test zeigte, dass Synchronize blockierend ist, also weiß ich nicht was es für Fehler geben könnte.

Wird möglicherweise "Canvas.Draw" von einem anderen Thread ausgeführt der ebenfalls für die Mausverarbeitung über der Form zuständig ist? Wenn ja, wie kann ich das beheben?

Mavarik 2. Okt 2015 12:46

AW: Threadübergreifende Bitmap
 
Du zeichnest NIE auf die PaintBox...

FirstTry 2. Okt 2015 12:50

AW: Threadübergreifende Bitmap
 
Zitat:

Zitat von Mavarik (Beitrag 1317499)
Du zeichnest NIE auf die PaintBox...

Code:
procedure TForm1.PaintBox1Paint(Sender: TObject);
begin
Paintbox1.Canvas.Draw(0,0, FBild);
end;
wird in einem Timer alle 10 ms aufgerufen. (Steht oben auch schon)
Wieso sollte es sonst auch bis zu der Mausbewegung funktionieren?!

Bernhard Geyer 2. Okt 2015 13:02

AW: Threadübergreifende Bitmap
 
Zitat:

Zitat von Namenloser (Beitrag 1317437)
Grundsätzlich können solche Dinge schon passieren, wenn man auf GDI-Objekte wie TBitmap oder TCanvas fälschlicherweise mit mehreren Threads parallel zugreift. Aber da du Synchronize verwendest, sollte es hier eigentlich zu keinen Problemen kommen.

Doch, kommt es! Alle Win32-Ressourcen (Und TCanvas, TBitmap verwenden solche) sind nur im Erzeugenden Thread gültig. Alle Aktionen mit diesen müssen im erzeugenden Thread erfolgen.
Und die VCL baut hier (aus verständlichen Gründen) keinen Threadschutz um den Zugriff herum.

Die sporadischen Fehlermeldungen sind eigentlich nur Zufällig funktionierende Zugriffe.

Mavarik 2. Okt 2015 13:15

AW: Threadübergreifende Bitmap
 
OK...

Timer 10ms geht nicht..

Vergiss den Timer...

Folgendes ist zu ändern:

Delphi-Quellcode:
  aBild.Canvas.Font.Name := 'Arial';
Im Thread noch setzen "vor der While"

Dann Uses Unit1 in Unit2

und

Delphi-Quellcode:
procedure TTestThread.Zeichne;
begin
  FBild.Canvas.StretchDraw( Rect(0,0,FBild.Width,FBild.Height), aBild );
  Form1.Paintbox1.Canvas.Draw(0,0, FBild); // neu
end;
Schon funktioniert es!

Bernhard Geyer 2. Okt 2015 13:34

AW: Threadübergreifende Bitmap
 
Zitat:

Zitat von Mavarik (Beitrag 1317505)
OK...

Timer 10ms geht nicht..

Vergiss den Timer...

Folgendes ist zu ändern:

Delphi-Quellcode:
  aBild.Canvas.Font.Name := 'Arial';
Im Thread noch setzen "vor der While"

Dann Uses Unit1 in Unit2

und

Delphi-Quellcode:
procedure TTestThread.Zeichne;
begin
  FBild.Canvas.StretchDraw( Rect(0,0,FBild.Width,FBild.Height), aBild );
  Form1.Paintbox1.Canvas.Draw(0,0, FBild); // neu
end;
Schon funktioniert es!

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

FirstTry 2. Okt 2015 13:53

AW: Threadübergreifende Bitmap
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1317501)
Alle Win32-Ressourcen (Und TCanvas, TBitmap verwenden solche) sind nur im Erzeugenden Thread gültig. Alle Aktionen mit diesen müssen im erzeugenden Thread erfolgen.
Und die VCL baut hier (aus verständlichen Gründen) keinen Threadschutz um den Zugriff herum.
Die sporadischen Fehlermeldungen sind eigentlich nur Zufällig funktionierende Zugriffe.

Ich verwende nur FBild in beiden Threads, und wenn ich irgendwas mit FBild mache rufe ich die Methode im Thread immer mit synchronize auf, also müsste das "eigentliche" zeichnen doch auch im GUI-Thread passieren oder nicht?


Zitat:

Zitat von Mavarik (Beitrag 1317505)
Schon funktioniert es!

Nein selbst dann funktioniert es nicht!
Und zusätzlich habe ich dann eine (kleine) Kreuzreferenz zwischen Unit1 und 2, Zeichne unnötigerweise auf ein Zwischenbitmap, da ich von der GUI ja nicht neuzeichnen sollte und abgesehen davon ist es echt nicht schön von einer Klasse auf die "höhere" Klasse zuzugreifen.

Zitat:

Zitat von Bernhard Geyer (Beitrag 1317510)
Zufälligerweise.
Jedes Zeichnen aus dem Thread auf im Hauptprogramm erzeugte Formulare kracht früher oder später.

Nein, es funktioniert nicht einmal.
Das sehe ich auch so, deshalb möchte ich die Zeichnung nur "irgendwie" (aber ordentlich!) rüberkriegen...

Danke für eure Hilfe, leider hat keiner einen funktionierenden Lösungsansatz bishher liefern können.

Bernhard Geyer 2. Okt 2015 13:56

AW: Threadübergreifende Bitmap
 
Zitat:

Zitat von FirstTry (Beitrag 1317514)
Zitat:

Zitat von Bernhard Geyer (Beitrag 1317501)
Alle Win32-Ressourcen (Und TCanvas, TBitmap verwenden solche) sind nur im Erzeugenden Thread gültig. Alle Aktionen mit diesen müssen im erzeugenden Thread erfolgen.
Und die VCL baut hier (aus verständlichen Gründen) keinen Threadschutz um den Zugriff herum.
Die sporadischen Fehlermeldungen sind eigentlich nur Zufällig funktionierende Zugriffe.

Ich verwende nur FBild in beiden Threads, und wenn ich irgendwas mit FBild mache rufe ich die Methode im Thread immer mit synchronize auf, also müsste das "eigentliche" zeichnen doch auch im GUI-Thread passieren oder nicht?

Das TBitmap hat aber auch Win32-Ressourcen/handles "on board". Könnte also auch Problematisch sein.
Probier doch mal statt TBitmap TPngImage.

FirstTry 2. Okt 2015 14:04

AW: Threadübergreifende Bitmap
 
TPngImage gibts erst ab XE7 wenn ich das richtig sehe.
Ich arbeite noch mit der Steinzeitversion 7

Bernhard Geyer 2. Okt 2015 15:04

AW: Threadübergreifende Bitmap
 
Zitat:

Zitat von FirstTry (Beitrag 1317517)
TPngImage gibts erst ab XE7 wenn ich das richtig sehe.
Ich arbeite noch mit der Steinzeitversion 7

Es gibt glaube ich eine CC-Download bei Emba für PNGs in älteren Delphi-Versionen.
Falls du TMS einsetzt, diese haben eine eigene Implementierung (haben die OpenSource-Version lizenziert bevor Emba diese gekauft hat).

SMO 2. Okt 2015 15:04

AW: Threadübergreifende Bitmap
 
TPngImage sollte seit Delphi 2009 enthalten sein.
Das Original von Gustavo Daud sollte auch mit Delphi 7 funktionieren, wenn du es noch irgendwo findest.

FirstTry 2. Okt 2015 15:46

AW: Threadübergreifende Bitmap
 
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?

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...

Bernhard Geyer 3. Okt 2015 13:41

AW: Threadübergreifende Bitmap
 
Zitat:

Zitat von Mavarik (Beitrag 1317583)
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...

Bringt aber nicht wenn das was zu zeichnen willst im Thread erzeugt wurde und wie TBitmap Teile hat die Win32-GDI-Ressourcen verwenden

Mavarik 3. Okt 2015 13:44

AW: Threadübergreifende Bitmap
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1317584)
Zitat:

Zitat von Mavarik (Beitrag 1317583)
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...

Bringt aber nicht wenn das was zu zeichnen willst im Thread erzeugt wurde und wie TBitmap Teile hat die Win32-GDI-Ressourcen verwenden

Die Paintbox wurde nicht im Thread erzeugt...

Bernhard Geyer 3. Okt 2015 13:45

AW: Threadübergreifende Bitmap
 
Zitat:

Zitat von Mavarik (Beitrag 1317585)
Die Paintbox wurde nicht im Thread erzeugt...

Aber das Bitmap wurde im Thread erzeugt. Und das will man ja dann im Hauptthread zeichnen.

Mavarik 3. Okt 2015 13:55

AW: Threadübergreifende Bitmap
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1317587)
Zitat:

Zitat von Mavarik (Beitrag 1317585)
Die Paintbox wurde nicht im Thread erzeugt...

Aber das Bitmap wurde im Thread erzeugt. Und das will man ja dann im Hauptthread zeichnen.

Boh... Eben nicht...

Es wird im HauptThread die Paitbox gezeichnet bzw. auf die Paintbox...
Es wird lediglich der grafische Inhalt von A nach B Kopiert...
Also alles gut, daher Funktioniert es ja nach meinen Änderungen

Bernhard Geyer 3. Okt 2015 14:06

AW: Threadübergreifende Bitmap
 
Zitat:

Zitat von Mavarik (Beitrag 1317589)
Zitat:

Zitat von Bernhard Geyer (Beitrag 1317587)
Zitat:

Zitat von Mavarik (Beitrag 1317585)
Die Paintbox wurde nicht im Thread erzeugt...

Aber das Bitmap wurde im Thread erzeugt. Und das will man ja dann im Hauptthread zeichnen.

Boh... Eben nicht...

Es wird im HauptThread die Paitbox gezeichnet bzw. auf die Paintbox...
Es wird lediglich der grafische Inhalt von A nach B Kopiert...
Also alles gut, daher Funktioniert es ja nach meinen Änderungen

Ja. nach den Änderungen. Davor (initial) aber nicht.

Mavarik 3. Okt 2015 14:14

AW: Threadübergreifende Bitmap
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1317591)
Ja. nach den Änderungen. Davor (initial) aber nicht.

Hat ja keine behauptet... Daher postet ich ja die nötigen Änderungen...
Ok egal - ich bin raus...

Mavarik

PS : LTQ

FirstTry 3. Okt 2015 20:56

AW: Threadübergreifende Bitmap
 
Vielen Dank für eure Hilfe!

Mit TBitmap32 funktioniert alles einwandfrei.
Wäre nett wenn mir jemand dazu gute Tutorials/ Beispiele liefern könnte.

Ansonsten sehe ich diesen Thread als geschlossen :)


Abschließend: TBitmap (oder sonst etwas, dass TCanvas nutzt) sollte nicht in Threads verwendet werden.

Der schöne Günther 4. Okt 2015 07:18

AW: Threadübergreifende Bitmap
 
War mir persönlich auch vollkommen neu. Haben wir alle die Doku nicht richtig gelesen oder steht das da schlichtweg nicht drin?

Namenloser 4. Okt 2015 09:29

AW: Threadübergreifende Bitmap
 
Zitat:

Zitat von Bernhard Geyer (Beitrag 1317501)
Zitat:

Zitat von Namenloser (Beitrag 1317437)
Grundsätzlich können solche Dinge schon passieren, wenn man auf GDI-Objekte wie TBitmap oder TCanvas fälschlicherweise mit mehreren Threads parallel zugreift. Aber da du Synchronize verwendest, sollte es hier eigentlich zu keinen Problemen kommen.

Doch, kommt es! Alle Win32-Ressourcen (Und TCanvas, TBitmap verwenden solche) sind nur im Erzeugenden Thread gültig. Alle Aktionen mit diesen müssen im erzeugenden Thread erfolgen.

Wozu gibt es denn dann Delphi-Referenz durchsuchenTCanvas.Lock?


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