Delphi-PRAXiS
Seite 1 von 4  1 23     Letzte »    

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


Alle Zeitangaben in WEZ +1. Es ist jetzt 08:52 Uhr.
Seite 1 von 4  1 23     Letzte »    

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