UI Controls aktualisieren

05/02/2015 09:39 exception1337#1
Heyho!
Wollte mal gerne von euch wissen, was die beste Lösung ist um UI Controls(genauer gesagt Labels), in einem Interval
von ca. 200-300 Millisekunden zu aktualisieren, ohne das die Performance bzw. die Stabilität der Anwendung darunter leidet?
Momentan aktualisiere ich meine Labels ganz normal aus einem Thread heraus mittels Invoke-Funktion. Falls das was zur Sache
tut: Die Labels dienen als Counter und behinhalten demach nur Zahlen!

Grüße, exception
05/02/2015 12:38 Mostey#2
Ich nehme mal an du nutzt das WinForms Framework. Das Problem ist, dass du, wenn du in einem 200 - 300 ms Interval die Label aktualisierst, zu viel Rechenleistung verschwendest. Ich persönlich würde dir entweder zu einem Framework mit Support für Datenbinding raten (z.B. WPF) oder alternativ Properties zu definieren die das Label jedes mal aktualisieren, wenn du den Wert änderst. Das geht natürlich hier nur bis zu einem gewissen Grad weil das WinForms Framework darauf einfach nicht ausgelegt ist.

Code:
private int _Value;
public int Value
{
    get { return _Value; }
    set
    {
        _Value = value;
        LabelValue.Text = value.ToString();
    }
}
wäre einer der wenigen Möglichkeiten, die du hier hast. Sollte das nicht gehen weil der Datentyp beispielsweise nur ein Objekt ist, dessen Felder du ändern willst musst du wohl zu einem Timer greifen.
05/02/2015 12:58 Else#3
Die Alternative wäre, mittels Events, bei einer Veränderung, zu arbeiten. Damit bist du weniger an den setter gebunden. ;-) Siehe z.B. auch [Only registered and activated users can see links. Click Here To Register...].
05/02/2015 13:46 exception1337#4
Hey,
erstmal Danke an euch beiden für die Antwort!

Korregiert mich bitte wenn ich falsch liege aber kommt das nicht genau aufs selbe wenn ich eine Methode oder ein Event dafür verwende? Im Endeffekt wird das Label auf der Form bei Veränderung des Counter Integers ebenso sofort aktualisiert und genau dieser Prozess erzeugt die CPU Belastung, oder?

Im Moment verwende ich ja einen Extra Thread der in einer Loop mit jeweils 1 Sekunde Delay alle Labels refresht. Natürlich könnte ich das Delay auf 5 Sekunden oder was auch immer raufsetzen um an Leistung einzusparen aber damit bin ich nicht wirklich zufrieden.

Wie schauts denn im Bezug auf Controls aus? Gibts da vielleicht irgendwas anderes was sicher besser als ein Label eignet?
05/02/2015 14:20 Else#5
Der wesentliche unterschied zu Mosteys Lösung ist diese, dass meine mittels Event agiert (dynamisch) und die andere eben fest deklarierte ist. So kannst Du eben DANN das Control-Element aktualisieren, wenn tatsächlich ein neuer Wert zugewiesen wurde und nicht jedes mal, wenn kein neuer existiert.

Probier es aus, was es bringt! ;-)
05/03/2015 10:00 Mostey#6
Quote:
Originally Posted by exception1337 View Post
Korregiert mich bitte wenn ich falsch liege aber kommt das nicht genau aufs selbe wenn ich eine Methode oder ein Event dafür verwende? Im Endeffekt wird das Label auf der Form bei Veränderung des Counter Integers ebenso sofort aktualisiert und genau dieser Prozess erzeugt die CPU Belastung, oder?
Nein.

Es ist ein großer Unterschied ob du im 200 MS Takt den Wert des Labels überschreibst, obwohl eigentlich gar keine Änderung notwendig gewesen wäre. Und dass du dann noch die Aktion an einen anderen Dispatcher weitergeben musst, macht es letztendlich noch langsamer.

Wenn du allerdings nur dann den Wert aktualisierst, wenn dieser sich tatsächlich auch geändert hat, entsteht um einiges weniger Aufwand für die CPU.


Quote:
Originally Posted by exception1337 View Post
Wie schauts denn im Bezug auf Controls aus? Gibts da vielleicht irgendwas anderes was sicher besser als ein Label eignet?
Die Controls beeinflussen das nicht. Du brauchst eine Möglichkeit, eine Eigenschaft bzw. Feld aus deinem Code an eine Eigenschaft eines Controls zu binden. Ich kenne da nur die native Lösung mittels WPF, die solltest du dir zu Herzen nehmen wenn dir das wirklich wichtig ist: [Only registered and activated users can see links. Click Here To Register...]
05/11/2015 10:22 MrSm!th#7
Auch WinForms können in gewissem Maße DataBinding.