Delphi-PRAXiS

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 11: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 11: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 11: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 11:18

AW: Gauge Refresh-Probleme
 
Oh,

willkommen in der DP :dp:

andresku 6. Apr 2011 11: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 11: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 11: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 11:46

AW: Gauge Refresh-Probleme
 
Einleuchtend!

Danke

:wink:

ChrisE 6. Apr 2011 11: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 11: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 ;)

alfold 6. Apr 2011 12:23

AW: Gauge Refresh-Probleme
 
Zitat:

Zitat von andresku (Beitrag 1093361)
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).

Wie schon geschrieben, lass Deinen thread die Messwerte holen unabhängig Deiner Anzeige!
Im Mainthread, deine Gauges per Timer aktuallisieren, wenn es nicht explizit Zeitgenau sein muss!(< 50msec lebenswichtig oder so) Die TimerKompnente nimmt es nicht sehr genau, darum der Hinweis.

alfold

Deep-Sea 6. Apr 2011 12:54

AW: Gauge Refresh-Probleme
 
Zitat:

Zitat von alfold (Beitrag 1093385)
[...] per Timer aktuallisieren, wenn es nicht explizit Zeitgenau sein muss!(< 50msec lebenswichtig oder so)

Eine Aktualisierung im Intervall < 50ms entspricht einer Frequenz > 20Hz, viel schneller kann das menschliche Auge nicht einmal einen Unterschied feststellen (geschweige denn - bei Texten - etwas lesen, wenn sich die Werte ständig ändern sollten). :-D

alfold 6. Apr 2011 13:04

AW: Gauge Refresh-Probleme
 
Genau :wink:
Mir ging es um die Auswertung und weniger um die Anzeige.
Falls man ausversehen die Auswertung der Daten mit in den Timer packt(soll ja schon vorgekommen sein :roteyes:):mrgreen:

alfold


Alle Zeitangaben in WEZ +1. Es ist jetzt 22:00 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