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 4  1 23     Letzte »    
FirstTry

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

Threadübergreifende Bitmap

  Alt 1. Okt 2015, 22:19
Delphi-Version: 5
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.
Angehängte Dateien
Dateityp: zip Fehler.zip (2,5 KB, 22x aufgerufen)
  Mit Zitat antworten Zitat
hathor
(Gast)

n/a Beiträge
 
#2

AW: Threadübergreifende Bitmap

  Alt 1. Okt 2015, 23:13
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;

Geändert von hathor ( 1. Okt 2015 um 23:23 Uhr)
  Mit Zitat antworten Zitat
FirstTry

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

AW: Threadübergreifende Bitmap

  Alt 1. Okt 2015, 23:46
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?
  Mit Zitat antworten Zitat
Namenloser

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

AW: Threadübergreifende Bitmap

  Alt 1. Okt 2015, 23: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
 
#5

AW: Threadübergreifende Bitmap

  Alt 2. Okt 2015, 00: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
 
#6

AW: Threadübergreifende Bitmap

  Alt 2. Okt 2015, 00: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
 
#7

AW: Threadübergreifende Bitmap

  Alt 2. Okt 2015, 00: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
 
#8

AW: Threadübergreifende Bitmap

  Alt 2. Okt 2015, 00: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
 
#9

AW: Threadübergreifende Bitmap

  Alt 2. Okt 2015, 12: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.126 Beiträge
 
Delphi 10.3 Rio
 
#10

AW: Threadübergreifende Bitmap

  Alt 2. Okt 2015, 12:46
Du zeichnest NIE auf die PaintBox...
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 1 von 4  1 23     Letzte »    


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 12:31 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