IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

[WPF] Générateur de flux de donnée en temps réel.


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2004
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2004
    Messages : 145
    Par défaut [WPF] Générateur de flux de donnée en temps réel.
    Bonjour,
    Je dois créer un objet qui permet de fournir des données en temps réel sur l’état d'une machine.
    Ce que je fait actuellement c'est que j'interroge a intervalle régulier les capteurs de la machine, je traite l'info et puis je génère des évènement en fonction des données.
    Mais voilà cette solution n'est pas optimale et me crée des problème de performance.

    quelqu'un pourrait me dire comment faire pour optimiser tout ça (pas forcement une solution prête mais des idées...), sachant que l'appli consommatrice de ce flux est en WPF, je pourrais peut être profiter du binding...?

    Merci.

  2. #2
    Rédacteur/Modérateur


    Homme Profil pro
    Développeur .NET
    Inscrit en
    Février 2004
    Messages
    19 875
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Février 2004
    Messages : 19 875
    Par défaut
    Citation Envoyé par zitoun Voir le message
    Mais voilà cette solution n'est pas optimale et me crée des problème de performance.
    Je ne vois rien de fondamentalement mauvais dans ton approche...

    Tu pourrais éventuellement inverser le fonctionnement du système, en faisant que la machine surveillée envoie elle-même les infos des capteurs (push). .NET 4 fournit des interfaces pour ce genre de choses : IObservable<T> et IObserver<T> (couplé à Linq et Reactive Extensions, ça permet de faire des choses sympa). Mais je ne vois pas trop en quoi ça améliorerait les performances, sauf si l'état des capteurs ne changent pas trop souvent (comme ça la machine n'envoie des notifications que s'il y a un changement).

    A quel niveau as-tu des problèmes de perfs ? Tu as essayé de profiler pour voir d'où ça venait ? Peut-être que ton approche est correcte mais qu'il y a des problèmes dans l'implémentation

    Citation Envoyé par zitoun Voir le message
    sachant que l'appli consommatrice de ce flux est en WPF, je pourrais peut être profiter du binding...?
    Tu pourrais, mais ça ne changerait pas vraiment le fond du problème à mon avis...

  3. #3
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2004
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2004
    Messages : 145
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Je ne vois rien de fondamentalement mauvais dans ton approche...

    Tu pourrais éventuellement inverser le fonctionnement du système, en faisant que la machine surveillée envoie elle-même les infos des capteurs (push). .NET 4 fournit des interfaces pour ce genre de choses : IObservable<T> et IObserver<T> (couplé à Linq et Reactive Extensions, ça permet de faire des choses sympa). Mais je ne vois pas trop en quoi ça améliorerait les performances, sauf si l'état des capteurs ne changent pas trop souvent (comme ça la machine n'envoie des notifications que s'il y a un changement).

    A quel niveau as-tu des problèmes de perfs ? Tu as essayé de profiler pour voir d'où ça venait ? Peut-être que ton approche est correcte mais qu'il y a des problèmes dans l'implémentation



    Tu pourrais, mais ça ne changerait pas vraiment le fond du problème à mon avis...
    Merci,
    Il semblerait que le problème soit le nombre élevé d’évènement.
    Le IObservable<T> et IObserver<T> semble intéressant. Je vais tenter des choses avec.

  4. #4
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Citation Envoyé par zitoun Voir le message
    Je dois créer un objet qui permet de fournir des données en temps réel sur l’état d'une machine.
    Quel objet ? La question est quel est ton architecture notamment comment consomme,ta vue WPF, les données d'acquisition. Web service ? buffer d'une base de données (dataset)? ... ?


    Ce que je fait actuellement c'est que j'interroge a intervalle régulier les capteurs de la machine, je traite l'info et puis je génère des évènement en fonction des données.
    Mais voilà cette solution n'est pas optimale et me crée des problème de performance.
    Dans quel cas de fonctionnement (nombre de machine, nombre de capteurs) les performances ne sont pas acceptables ?C'est de l'acquisition par pooling et tu génères un événement quand une valeur change par exemple ?

    Cela peut effectivement poser des problèmes de performance si tu passes ton temps à générer des événements (si tu as beaucoup de données de capteurs qui changent).

    Il faut en savoir plus sur ton architecture entre l'acquisition et la vue WPF. Notamment les contraintes de temps (réel) pour le rafraîchissement de la vue en fonction d'une donnée

    Une approche plus optimale serait de regrouper les données par période. Ainsi tu 'garantis' un nombre d'événements constants dans le temps pour un groupe de données constant(période de temps par exemple toutes les 10 minutes)

    Coupler au pattern Observateur cela me semble une idée à tester (sachant qu'il n'y aura qu'un observateur (la vue wpf))

  5. #5
    Membre confirmé
    Homme Profil pro
    Chef de projet NTIC
    Inscrit en
    Septembre 2004
    Messages
    145
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Tunisie

    Informations professionnelles :
    Activité : Chef de projet NTIC
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2004
    Messages : 145
    Par défaut
    Citation Envoyé par hegros Voir le message
    Quel objet ? La question est quel est ton architecture notamment comment consomme,ta vue WPF, les données d'acquisition. Web service ? buffer d'une base de données (dataset)? ... ?




    Dans quel cas de fonctionnement (nombre de machine, nombre de capteurs) les performances ne sont pas acceptables ?C'est de l'acquisition par pooling et tu génères un événement quand une valeur change par exemple ?

    Cela peut effectivement poser des problèmes de performance si tu passes ton temps à générer des événements (si tu as beaucoup de données de capteurs qui changent).

    Il faut en savoir plus sur ton architecture entre l'acquisition et la vue WPF. Notamment les contraintes de temps (réel) pour le rafraîchissement de la vue en fonction d'une donnée

    Une approche plus optimale serait de regrouper les données par période. Ainsi tu 'garantis' un nombre d'événements constants dans le temps pour un groupe de données constant(période de temps par exemple toutes les 10 minutes)

    Coupler au pattern Observateur cela me semble une idée à tester (sachant qu'il n'y aura qu'un observateur (la vue wpf))
    Grossomodo l'architecture se resume a un Ecran de monitoring avec tout les indicateur nécessaires (le view), un controlleur qui implémente INotifyPropertyChanged (le viewModel). Un gestionnaire de donnée (Model) qui instancie un moteur (engine) qui s'execute dans un backgroundworker et a chaque fois qu'il trouve des donnée génère toutes sortes d'evenement porteurs de donnée.

    - Le view a pour dataContext le viewModel
    - Les propriétes du viewModel sont des double, int, DateTime et des ObservableCollection.
    - Les differents champs du view sont bindés au propriétés du viewModel.
    - Le Model s'inscrit a tout les evenement de l'engire et update le viewModel a chaque fois que l'engine le notifie.
    - L'engine execute a intervalle regulier un traitement qui interroge via une API fournie par le constructeur les capteurs de la machine.

    voilà voilà...
    J'espère que c'est compréhensible.

    Si je trouve rien je penserai peut être a diminuer la fréquence d’exécution de mon engine.

    Merci.

  6. #6
    Membre extrêmement actif

    Homme Profil pro
    Ingénieur R&D
    Inscrit en
    Juin 2003
    Messages
    4 506
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur R&D
    Secteur : Industrie

    Informations forums :
    Inscription : Juin 2003
    Messages : 4 506
    Par défaut
    Citation Envoyé par zitoun Voir le message
    Grossomodo l'architecture se resume a un Ecran de monitoring avec tout les indicateur nécessaires (le view), un controlleur qui implémente INotifyPropertyChanged (le viewModel). Un gestionnaire de donnée (Model) qui instancie un moteur (engine) qui s'execute dans un backgroundworker et a chaque fois qu'il trouve des donnée génère toutes sortes d'evenement porteurs de donnée.

    Un peu bizarre que le modèle instancie l'engine l'inverse me semble plus logique (grasp pattern création) ou alors le controlleur.


    - Le view a pour dataContext le viewModel
    - Les propriétes du viewModel sont des double, int, DateTime et des ObservableCollection.
    - Les differents champs du view sont bindés au propriétés du viewModel.
    - Le Model s'inscrit a tout les evenement de l'engire et update le viewModel a chaque fois que l'engine le notifie.
    - L'engine execute a intervalle regulier un traitement qui interroge via une API fournie par le constructeur les capteurs de la machine.
    J'espère que c'est compréhensible.
    Oui c'est très clair comme description.

    Si je trouve rien je penserai peut être a diminuer la fréquence d’exécution de mon engine.
    Est-ce que tu gères une bande morte ? C'est à dire que les notifications se font lorsque la valeur courante d'une donnée change d'un certain seuil par rapport à la précédente acquise ?

    C'est quoi aujourd'hui la fréquence d'exécution des notifications, combien de réseaux d'équipements en moyenne et quelle protocole de communication (si c'est du série à 900bauds il faut déjà plusieurs (minutes) pour acquérir une donnée...)

    Augmenter la fréquence c'est bien mais tu n'as pas de contrainte de temps pour rafraîchir une donnée sur la vue ? Parce qu'il y a quoi sur la vue des données sur des stocks qui peuvent attendre 10heures pour se rafraîchir ou alors une valeur d'une pression dans une centrale nucléaire ?

    Il faut chercher une solution déterministe pour le rafraîchissement car si le nombre d'équipements est important ou la vitesse de communication trop lente il faut prendre en compte ce "temps en plus" d'acquisition dans le décompte pour la mise à jour de la vue

Discussions similaires

  1. Acquisition de données USB temps réel sous Linux Xenomai
    Par nourryan dans le forum Matériel
    Réponses: 1
    Dernier message: 03/05/2012, 14h45
  2. données en temps réel
    Par boutinj dans le forum Powerpoint
    Réponses: 3
    Dernier message: 15/07/2008, 17h50
  3. Envoi et réception de données : Communication Temps Réel
    Par mehdi_862000 dans le forum VC++ .NET
    Réponses: 8
    Dernier message: 26/05/2008, 14h14
  4. Copie d'une base de donnée en temps réel
    Par brunoleduic dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 24/09/2007, 04h07
  5. Réponses: 7
    Dernier message: 27/01/2006, 01h44

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo