Frage

Diese Frage ist eine Weiterentwicklung meiner Frage Verschiedene Möglichkeiten der Daten Beobachtung ändert .

ich noch viele Klassen in meiner C ++ Anwendung habe, die aktualisiert werden (oder kann aktualisiert werden) häufig in komplexen mathematischen Routinen und in komplexen Stücken von Geschäftslogik.

Wenn ich für den ‚Beobachter‘ Ansatz gehen und Benachrichtigungen ein Wert einer Instanz jedes Mal aussenden geändert, ich habe 2 große Risiken:

  • Versenden der Mitteilungen selbst die Anwendungen verlangsamen kann ernsthaft
  • , wenn Elemente der Benutzeroberfläche durch die Änderung aktualisiert werden müssen, werden sie bei jeder Änderung aktualisiert, was z.B. Bildschirme thousends Mal aktualisiert werden, während einige Stück der Geschäftslogik ausführt

Einige Probleme können durch Zugabe von Puffermechanismen gelöst werden (wo Sie Benachrichtigungen senden, wenn Sie mit einem algorith beginnen werden, und wenn der Algorithmus fertig ist), aber da die Business-Logik kann auf viele Orte in der ausgeführt werden Software, wir fast überall Pufferung, nach jeder möglichen Aktion ausgewählt im Menü am Ende hinzufügen.

Statt den ‚Beobachter‘ aproach, könnte ich auch den ‚mark-dirty‘ Ansatz, nur die Instanzen Markierung, die verändert wurde, und am Ende der Aktion erzählen die Benutzeroberfläche, dass es sollte selbst aktualisieren.

Auch die Geschäftslogik von überall innerhalb der Anwendung ausgeführt werden kann, so kann in der Praxis wir einen zusätzlichen Anruf hinzufügen müssen (sagen alle Fenster sie selbst aktualisieren sollte) nach fast jede Aktion des Benutzers ausgeführt wird.

scheinen Beide Ansätze ähnlich zu haben, aber gegenüber Nachteile:

  • Mit dem ‚Beobachter‘ Ansatz haben wir das Risiko der Aktualisierung der Benutzer-Schnittstelle zu oft
  • Mit dem ‚mark-dirty‘ nähern wir haben das Risiko der nicht die Anwenderschnittstelle auf allen Aktualisierung

Beiden Nachteile durch das Einbetten jede Anwendung Aktion innerhalb zusätzlicher Logik (für Beobachter: Versenden von Start-Ende-Benachrichtigungen für mark-dirty: Versenden von Update-yourself-Benachrichtigungen) gelöst werden könnten.

Hinweis, dass in nicht-Windowing-Anwendungen ist dies wahrscheinlich kein Problem. Sie könnten zum Beispiel Verwenden Sie die Mark-schmutzig Ansatz und nur dann, wenn einige Berechnung der Daten benötigt, kann es brauchen einige zusätzliche Verarbeitung zu tun, falls die Daten schmutzig (das ist eine Art Ansatz von Caching).

Bei Anwendungen Windowing, gibt es kein Signal, dass der Benutzer ‚auf dem Bildschirm suchen‘, und dass die Fenster aktualisiert werden sollen. Also gibt es keinen wirklich guten Moment, in dem Sie auf den schmutzigen-Daten zu suchen haben (auch wenn Sie ein paar Tricks mit Fokus-Ereignissen tun könnten).

Was ist eine gute Lösung, um dieses Problem zu lösen? Und wie haben Sie Probleme wie diese in Ihrer Anwendung gelöst?

Beachten Sie, dass ich nicht will Windowing-Techniken bei der Berechnung / Datamodel Teil meiner Anwendung einzuführen. Wenn Windowing-Techniken erforderlich sind, um dieses Problem zu lösen, es muss nur in dem User-Interface-Teil meiner Anwendung verwendet werden.

Jede Idee?

War es hilfreich?

Lösung

Ein Ansatz, den ich verwendet wurde mit einem großen Windows-Anwendung ein paar Jahre zurück WM_KICKIDLE zu verwenden. Alle Dinge, die update-fähig sind verwenden eine abstrakte Basisklasse genannt IdleTarget. Ein IdleTargetManager dann fängt die KICKIDLE Nachrichten und ruft das Update auf eine Liste der registrierten Kunden. In Ihrem Fall Sie eine Liste der spezifischen Ziele zu aktualisieren schaffen könnten, aber ich fand die Liste der registrierten Kunden genug.

Der einzige Gotcha Ich Hit war mit einem Echtzeit-Graph. nur den Kick Leerlauf-Nachricht mit würde die CPU auf 100% aufgrund der ständigen Aktualisierung des Graphen Spitze. Verwenden Sie einen Timer, um zu schlafen, bis die nächste Aktualisierung dieses Problem gelöst werden.

Wenn Sie weitere Hilfe benötigen - Ich bin zu vernünftigen Preisen ...: -)

Andere Tipps

Ein weiterer Punkt, den ich dachte.

Wenn Sie durch die Anzahl der generierten Ereignisse überwältigt werden und möglicherweise extra Arbeit es verursacht wird, müssen Sie unter Umständen eine zwei Phasen nähern:

  • Sie die Arbeit
  • Commit

an die Benachrichtigungen nur dann gesendet werden, auf begehen.

Es hat den Nachteil, zwingt einen Code neu zu schreiben ...

Sie können die Beobachter-Muster mit koaleszierenden verwenden. Es könnte ein wenig hässlich zu implementieren in C ++, though. Es würde wie folgt aussehen:

m_observerList.beginCoalescing();
m_observerList.notify();
m_observerList.notify();
m_observerList.notify();
m_observerList.endCoalescing(); //observers are notified here, only once

Also auch wenn Sie anrufen notify dreimal werden die Beobachter tatsächlich erst endCoalescing benachrichtigt, wenn die Beobachter nur benachrichtigt einmal.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top