Delphi-PRAXiS
Seite 2 von 4     12 34      

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 14:43 Uhr.
Seite 2 von 4     12 34      

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