AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

Threadübergreifende Bitmap

Ein Thema von FirstTry · begonnen am 1. Okt 2015 · letzter Beitrag vom 4. Okt 2015
Antwort Antwort
Seite 1 von 2  1 2      
Namenloser

Registriert seit: 7. Jun 2006
Ort: Karlsruhe
3.724 Beiträge
 
FreePascal / Lazarus
 
#1

AW: Threadübergreifende Bitmap

  Alt 2. Okt 2015, 00:52
Hallo FirstTry, Willkommen in der DP.

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?

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.
  Mit Zitat antworten Zitat
FirstTry

Registriert seit: 1. Okt 2015
10 Beiträge
 
#2

AW: Threadübergreifende Bitmap

  Alt 2. Okt 2015, 01:09
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.

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
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#3

AW: Threadübergreifende Bitmap

  Alt 2. Okt 2015, 01:19
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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
FirstTry

Registriert seit: 1. Okt 2015
10 Beiträge
 
#4

AW: Threadübergreifende Bitmap

  Alt 2. Okt 2015, 01:26
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?
  Mit Zitat antworten Zitat
Benutzerbild von Luckie
Luckie

Registriert seit: 29. Mai 2002
37.621 Beiträge
 
Delphi 2006 Professional
 
#5

AW: Threadübergreifende Bitmap

  Alt 2. Okt 2015, 01:39
Ö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.
Michael
Ein Teil meines Codes würde euch verunsichern.
  Mit Zitat antworten Zitat
FirstTry

Registriert seit: 1. Okt 2015
10 Beiträge
 
#6

AW: Threadübergreifende Bitmap

  Alt 2. Okt 2015, 13:18
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?
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.152 Beiträge
 
Delphi 10.3 Rio
 
#7

AW: Threadübergreifende Bitmap

  Alt 2. Okt 2015, 13:46
Du zeichnest NIE auf die PaintBox...
  Mit Zitat antworten Zitat
FirstTry

Registriert seit: 1. Okt 2015
10 Beiträge
 
#8

AW: Threadübergreifende Bitmap

  Alt 2. Okt 2015, 13:50
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?!
  Mit Zitat antworten Zitat
Benutzerbild von Bernhard Geyer
Bernhard Geyer

Registriert seit: 13. Aug 2002
17.210 Beiträge
 
Delphi 10.4 Sydney
 
#9

AW: Threadübergreifende Bitmap

  Alt 2. Okt 2015, 14:02
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.
Windows Vista - Eine neue Erfahrung in Fehlern.
  Mit Zitat antworten Zitat
Benutzerbild von Mavarik
Mavarik

Registriert seit: 9. Feb 2006
Ort: Stolberg (Rhld)
4.152 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Threadübergreifende Bitmap

  Alt 2. Okt 2015, 14:15
OK...

Timer 10ms geht nicht..

Vergiss den Timer...

Folgendes ist zu ändern:

  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!
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 2  1 2      


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 21:32 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