Laden...

Ist Control im sichtbaren Bereich ?

Erstellt von DiViP vor 14 Jahren Letzter Beitrag vor 14 Jahren 2.091 Views
D
DiViP Themenstarter:in
27 Beiträge seit 2009
vor 14 Jahren
Ist Control im sichtbaren Bereich ?

Hallo,

ich habe schon nach der im Betreff stehenden Frage gesucht, konnte aber nichts passendes finden.

Ich habe ein Panel, welches verschiedene Controls (Label, Progressbar) enthält. Diese Controls werden jede Sekunde mit berechneten Daten aktualisiert. Diese Berechnungen bzw. die Controls dienen lediglich der Visualisierung und brauchen daher nicht berechnet und aktualisiert werden, wenn Sie für den User nicht sichtbar sind.
Mit nicht sichtbar meine ich, dass das Control außerhalb des Bildschirms ist, oder überdeckt wird von einem anderen Fenster oder das Fenster selbst minimiert ist.

Wie finde heraus ob ein Control für den User sichtbar ist ?

mfg

5.299 Beiträge seit 2008
vor 14 Jahren

normalerweise kümmert man sich nicht darum. Da werden einfach alle Controls aktualisiert, und gut.

Was nämlich teuer ist, ist, wenn die Controls sich zeichnen. Wenn aber ein Control verdeckt ist, zeichnet es sich auch nicht, und kein Problem.

Der frühe Apfel fängt den Wurm.

4.931 Beiträge seit 2008
vor 14 Jahren

Die einfachste Methode wäre wohl, jeweils das Paint-Ereignis zu abonnieren und dann ein Invalidate() von außen aufzurufen.
Für nicht sichtbare Controls dürfte dann das Paint-Ereignis nicht aufgerufen werden.
Und im Paint-Ereignis dann die Datenaktualisierung anzustoßen.
Die eigentliche Berechnung (sofern sie länger als 10ms ist) würde ich dann aber besser in einen eigenen Thread auslagern, der dann die Anzeige per Invoke aktualisiert.

Mit der Eigenschaft 'Visible' findet man leider nicht direkt raus, ob ein Control wirklich für den User sichtbar ist (auch wenn es z.B. für ein scrollbares Form den Wert 'false' zurückliefert, wenn das Control gerade nicht sichtbar ist). Die anderen Fälle, wie z.B. Control ist gerade (teilweise) überdeckt, lassen sich damit aber nicht abdecken.

D
DiViP Themenstarter:in
27 Beiträge seit 2009
vor 14 Jahren

Danke für die Antworten.

Das mit dem Paint und Invalidate ist wohl das Beste. Die Idee hatte ich auch schon ist aber mit Aufwand verbunden. Ich hatte da eher an ein Property gedacht, was mir die Sichtbarkeit anzeigt.

Ich werde mal versuchen das mit Paint/Invalidate zu implementieren.

5.299 Beiträge seit 2008
vor 14 Jahren

das musstedann aber listenreich anfangen. Weil wennde im Paint dich erst daran machst, die Daten zu beschaffen, kannstedich ziemlich ausbremsen.

Weil auch beim resizen des Forms zeichnen sich die Controls jeweils neu, das sind dann oft sehr viele Paints (flackern).

Und im Paint kannste erst recht nicht einen Thread starten, der die Daten dann erst 10ms später bereitstellt, dann ist Paint schon durchgelaufen.

Gibtes überhaupt ein Problem, die Controls jedesmal gleich zu aktualisieren, egal ob sichtbar oder nicht?

Weil dann haben sie die Daten, und können sich painten, wie sies gewohnt sind, das dürfte noch das flotteste sein.

Der frühe Apfel fängt den Wurm.

D
DiViP Themenstarter:in
27 Beiträge seit 2009
vor 14 Jahren

Gibtes überhaupt ein Problem, die Controls jedesmal gleich zu aktualisieren, egal ob sichtbar oder nicht?

Die Berechnung kostet Zeit, daher ist es nicht optimal, wenn Sie jedes mal ausgeführt wird auch wenn sie nicht benötigt wird. Ich will die optimale Performance. 😃

5.299 Beiträge seit 2008
vor 14 Jahren

Wieviel Zeit kost das denn, und muß für jedes Control eine eigene zeitraubende Berechnung durchgeführt werden?

Weil ist recht ungewöhnlich, dass Berechnungen so aufwändig sind.

Bei Optimierungen muß man strikt darauf gucken, nur die Engpässe zu optimieren, und nur jede Sekunde einmal zu updaten scheint mir eigentlich eine sehr wirksame Methode, die Anwendung zu entlasten.

Und ob da nun jede Sekunde 10ms gerechnet wird, oder 30 - das hat keinen Sinn.

Selbst wenn die Gesamt-Berechnung 300ms dauerte, könnte man die in einen Thread auslagern, und wenn die Daten da sind - plink! alle Controls updaten (10ms).

Kein selber painten erforderlich, und auch nicht Invalidate() aufrufen, weil ein geupdatetes Control invalidiert sich selber.

Kommt natürlich aufs Control an - wenn ein DGV an eine Datasource mit 3000 Datensätzen gehängt wird - das müsste man ausprobieren, bzw. diskutieren, ob eine anzeige von 3000 Datensätzen überhaupt sinnig ist, weil wer will das angucken?

Machst du iwas mit DirectX oderso? Bildverarbeitung bei laufender Kamera und so Geschichten?

Der frühe Apfel fängt den Wurm.

D
DiViP Themenstarter:in
27 Beiträge seit 2009
vor 14 Jahren

Wieviel Zeit kost das denn, und muß für jedes Control eine eigene zeitraubende Berechnung durchgeführt werden?

Im Moment sind es nur einfache Berechnungen, also weniger Zeitraubend. Aber nach meiner Planung sollen da noch ein paar Sachen zusätzlich implementiert werden. Letztlich wird wahrscheinlich die Belastung der Systemperformance zu mindestens hier auf meinem alten P4 höchstens 1% ausmachen.
Es ist aber für mich unrelevant, wie viel Auslastung dadurch entsteht. Es geht darum dass überhaupt irgendwas gemacht wird, was unnötig ist, wenn es für den User nicht sichtbar ist. Das Programm läuft später mal im Hintergrund und soll das System nur minimal belasten.

Machst du iwas mit DirectX oderso? Bildverarbeitung bei laufender Kamera und so Geschichten?

Nein. Nur einfache Tabs, mit DGV, Labeln, gezeichnete Graphen auf einem Panel.