Delphi-PRAXiS
Seite 1 von 2  1 2      

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   GUI-Design mit VCL / FireMonkey / Common Controls (https://www.delphipraxis.net/18-gui-design-mit-vcl-firemonkey-common-controls/)
-   -   Gauge Refresh-Probleme (https://www.delphipraxis.net/159633-gauge-refresh-probleme.html)

andresku 6. Apr 2011 10:04

Gauge Refresh-Probleme
 
Hallo,

ich pflege ein Programm, in dem 6 Messwerte, die sich im 0,3 Sek. Takt verändern in 6 Gauges dargestellt werden. Ich habe hier 2 Probleme:
1. Nach der Werteänderung wird der Gauge-Refresh gelegentlich nicht durchgeführt (Gauge wird in komplementären Farben dargestellt - statt blau auf weiß kommt gelb auf schwarz).
2. Ebenfalls gelegentlich (selten) kommt es zu einem Grafik-Fehler (das Lesethread der Messwerte wird damit beendet).

Ist ähnliches Problem jemandem bekannt?
Was kann man tun um die Änderungen aller 6 Gauges gleichzeitig darzustellen? Gauge, wie auch das Vater-Objekt TGridPanel, kennen die Prozeduren "BeginUpdate-EndUpdate" leider nicht...
Ein Refresh des TGridPanel nach jedem Schleifendurchgang ist möglich und hilft, verursacht aber ein unschönes flackern des Blides. Ausserdem es hilft bei den Grafikabbrüchen nicht weiter. Das Problem mit den Abbrüchen sieht auf verschiedenen Rechnern unterschiedlich aus - ich vermute ein Zusammenhang mit der Qualität des Grafiktreibers. Das Bisschen "Rechteckzeichnen" sollte aber doch in Wirklichkeit kein Anspruch für die Grafik des Rechners darstellen...

Gruß

Andreas

Deep-Sea 6. Apr 2011 10:09

AW: Gauge Refresh-Probleme
 
  1. Invalidate ist ggf. dem Refresh (oder Repaint) vorzuziehen.
  2. Aktiviere DoubleBuffered, um das Flackern zu unterdrücken.

ChrisE 6. Apr 2011 10:15

AW: Gauge Refresh-Probleme
 
Hallo,
Zitat:

Zitat von andresku (Beitrag 1093361)
... 2. Ebenfalls gelegentlich (selten) kommt es zu einem Grafik-Fehler (das Lesethread der Messwerte wird damit beendet).

das heißt aber nicht, dass der Thread für die Aktualisierung sorgt?
Keine Zugriffe auf die VCL aus einem Thread heraus - außer Synchronized o.ä. :warn:

Gruß, Chris

[EDIT]
Welches Betriebssystem verwendetst du?
[/EDIT]

ChrisE 6. Apr 2011 10:18

AW: Gauge Refresh-Probleme
 
Oh,

willkommen in der DP :dp:

andresku 6. Apr 2011 10:39

AW: Gauge Refresh-Probleme
 
Zitat:

das heißt aber nicht, dass der Thread für die Aktualisierung sorgt?
Keine Zugriffe auf die VCL aus einem Thread heraus - außer Synchronized
Doch, der Thread, der aus USB liest, greift auf VLC (Gauges + Labels). Es gibt aber außer diesem einen Thread keinen anderen (bis auf den Hauptthread), der dazwischen Funken könnte. Ist es trotzdem schlecht?

DeddyH 6. Apr 2011 10:42

Qu
 
Das ist in der Tat schlecht, da die VCL nicht threadsafe ist. Ein Zugriff aus einem TThread heraus auf VCL-Komponenten darf nur über Delphi-Referenz durchsuchenSynchronize (oder IIRC neuerdings Queue) erfolgen.

Deep-Sea 6. Apr 2011 10:44

AW: Gauge Refresh-Probleme
 
Zitat:

Zitat von andresku (Beitrag 1093370)
Es gibt aber außer diesem einen Thread keinen anderen (bis auf den Hauptthread), der dazwischen Funken könnte.

Tja, damit ist die Frage doch beantwortet, oder?!
Die VCL ist nicht threadfest - das ist kein Geheimnis. Also musst du deine Software ändern, dann sollten die Probleme verschwinden :-D

Zitat:

Zitat von DeddyH (Beitrag 1093371)
[...] nur über Synchronize [...]

Oder aber auch PostMessage und SendMessage :wink:

andresku 6. Apr 2011 10:46

AW: Gauge Refresh-Probleme
 
Einleuchtend!

Danke

:wink:

ChrisE 6. Apr 2011 10:46

AW: Gauge Refresh-Probleme
 
Hallo,
Zitat:

Zitat von andresku (Beitrag 1093370)
Es gibt aber außer diesem einen Thread keinen anderen (bis auf den Hauptthread), der dazwischen Funken könnte. Ist es trotzdem schlecht?

Ja, dass ist leider schlecht :-)
Die VCL ist nicht Threadsave und sollte nur vom Hauptthread "benutzt" werden.
[ROTER KASTEN -> Mist DeddyH war schneller]
Entweder Synchronized aufrufe wie DeddyH empfiehlt, oder die speicherst den Wert in einem Puffer und schickst der Application / dem MainForm per PostMessage eine Nachricht, dass neue Werte da sind. Diese kann die Werte dann aus dem Puffer abholen und darstellen.

Welche variante du nimmst hängt meines erachtens davon ab, ob der USB-Thread zeitkritisch ist oder nicht. Wenn er so schnell wie möglich wieder zum "USB-Lesen" übergehen soll, würde ich die Puffer-Variante nehmen.

Gruß, Chris

[EDIT]
Mist, war viel zu langsam :-(
[/EDIT]

DeddyH 6. Apr 2011 10:55

AW: Gauge Refresh-Probleme
 
Zitat:

Zitat von Deep-Sea (Beitrag 1093373)
Zitat:

Zitat von DeddyH (Beitrag 1093371)
[...] nur über Synchronize [...]

Oder aber auch PostMessage und SendMessage :wink:

Mit SendMessage wäre ich in diesem Zusammenhang aber seeehr vorsichtig ;)


Alle Zeitangaben in WEZ +1. Es ist jetzt 02:37 Uhr.
Seite 1 von 2  1 2      

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