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

Dotnet Discussion :

Reactive (Rx) Framework pour appeler une méthode


Sujet :

Dotnet

  1. #1
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut Reactive (Rx) Framework pour appeler une méthode
    Bonjour,

    Je cherche à filtrer le traitement d'un event qui peut être déclenché plusieurs fois rapidement.
    Je voudrai qu'une des tâches effectuées par le déclenchement de cet event ne s'effectue pas à chaque déclenchement.

    Je me suis demandé si je pouvais utiliser Rx Framework et la méthode throttle pour arriver à mes fins mais je ne vois pas comment faire.
    L'exemple du throttle est ici : http://rxwiki.wikidot.com/101samples#toc29

    si quelqu'un connait RX et pouvait m'orienter vers la solution ce serai sympa
    de plus, est-ce que Throttle est la bonne méthode ? :/
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Oui, c'est bien Throttle qu'il faut utiliser. Tu as un exemple ici :
    http://www.japf.fr/2011/02/techdays-...d-source-code/

    EDIT: tout bien réfléchi, je ne suis pas certain que Throttle soit ce que tu veux... Si tu mets un Throttle de 1 seconde, il va attendre 1 seconde après la réception du dernier évènement. Si un autre évènement se produit avant la fin de la seconde, le compteur repart à 0 et ça attend de nouveau une seconde. Autrement dit, si ton évènement se produit toutes les demi-secondes, le Throttle ne le laissera jamais passer... C'est utile par exemple pour faire un système d'auto-complétion au fur et à mesure de la saisie, mais ce n'est pas adapté pour limiter le nombre d'évènements par intervalle de temps. Pour faire ça il faut utiliser Sample plutôt que Throttle

  3. #3
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    Merci pour ton lien Thomas
    Je ne pense pas que Sample soit adapté, le comportement que je cherche à obtenir est le résultat d'un ou plusieurs clics de l'utilisateur

    Je n'arrive pas à faire fonctionner Rx, je ne dois pas comprendre le fonctionnement

    Voici un exemple simple où en cliquant sur un bouton, on ajoute un message dans une collection et Rx devrait recopier le dernier message dans une string :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
        public class MainViewModel : NotificationObject
        {
            private IObservable<string> _dummyObservable;
            private IDisposable _dummySubscription;
     
            public MainViewModel()
            {
                _dummyObservable = Messages.ToObservable()
                    .Throttle(TimeSpan.FromSeconds(1));
                _dummySubscription = _dummyObservable.Subscribe(o => Message = o);
                InitializeCommands();
                Message = "Hello WPF";
            }
     
            private string _message = string.Empty;
            public string Message
            {
                get { return _message; }
                set
                {
                    _message = value;
                    RaisePropertyChanged(() => Message);
                }
            }
     
            private ObservableCollection<string> _messages = new ObservableCollection<string>();
            public ObservableCollection<string> Messages
            {
                get { return _messages; }
            }
     
            private void InitializeCommands()
            {
                AddItemCommand = new DelegateCommand(AddItemExecute);
            }
     
            public ICommand AddItemCommand { get; private set; }
            private int _counter = 0;
            private void AddItemExecute()
            {
                Messages.Add("Counter = " + ++_counter);
            }
        }
    j'ai créé une fenêtre WPF dans laquelle j'ai :
    - une TextBox qui affiche la string Message
    - une ListBox qui affiche la collection Messages
    - un Button qui execute la commande AddItemCommand

    résultat ? il ne se passe rien
    hormis le remplissage de la ListBox du fait du peuplement de la collection
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  4. #4
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par shenron666 Voir le message
    par conte, je ne pense pas que Sample soit adapté, vu que le comportement que je cherche à obtenir soit le résultat d'un ou plusieurs clic de l'utilisateur
    Je comprends pas ce que tu veux dire...

    Citation Envoyé par shenron666 Voir le message
    par contre, je n'arrive pas à faire fonctionner Rx, je ne dois pas comprendre le fonctionnement
    Tu ne peux pas te baser sur une collection comme tu le fais, ça ne fonctionne pas comme ça... Quand tu t'abonnes à l'observable renvoyé par Messages.ToObservable(), ça consomme immédiatement ce qu'il y a dans la collection, et les éléments ajoutés après ne sont pas pris en compte.

    Le plus simple est de gérer ça au niveau du code-behind avec Observable.FromEvent, mais vu que c'est du MVVM tu préfères peut-être gérer ça entièrement dans le ViewModel. Dans ce cas le plus simple est d'utiliser un Subject<string> :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
        public class MainViewModel : NotificationObject
        {
            private IObservable<string> _dummyObservable;
            private IDisposable _dummySubscription;
            private Subject<string> _changes;
     
            public MainViewModel()
            {
                _changes = new Subject<string>();
                _dummyObservable = _changes.Throttle(TimeSpan.FromSeconds(1));
                _dummySubscription = _dummyObservable.Subscribe(o => Message = o);
                InitializeCommands();
                Message = "Hello WPF";
            }
     
            private string _message = string.Empty;
            public string Message
            {
                get { return _message; }
                set
                {
                    _message = value;
                    RaisePropertyChanged(() => Message);
                }
            }
     
            private ObservableCollection<string> _messages = new ObservableCollection<string>();
            public ObservableCollection<string> Messages
            {
                get { return _messages; }
            }
     
            private void InitializeCommands()
            {
                AddItemCommand = new DelegateCommand(AddItemExecute);
            }
     
            public ICommand AddItemCommand { get; private set; }
            private int _counter = 0;
            private void AddItemExecute()
            {
                string newValue = "Counter = " + ++_counter;
                Messages.Add(newValue);
                _changes.OnNext(newValue);
            }
        }

  5. #5
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    Citation Envoyé par tomlev Voir le message
    Je comprends pas ce que tu veux dire...
    j'ai édité mon post précédent pour être plus clair, enfin j'espère :p

    merci pour ton exemple, ça fonctionne du tonnerre à l'aide de Subject
    mieux qu'avec mon throttle "maison"

    à part les exemples pas très explicites à mon goût, tu ne connaîtrais pas un tuto qui expliquerait plus concrètement le fonctionnement de Rx ?
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  6. #6
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par shenron666 Voir le message
    à part les exemples pas très explicites à mon goût, tu ne connaîtrais pas un tuto qui expliquerait plus concrètement le fonctionnement de Rx ?
    Pas vraiment... En général quand je l'utilise j'y vais un peu à tatons, en fouillant la doc.

  7. #7
    Expert confirmé
    Avatar de shenron666
    Homme Profil pro
    avancé
    Inscrit en
    Avril 2005
    Messages
    2 524
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Seine et Marne (Île de France)

    Informations professionnelles :
    Activité : avancé

    Informations forums :
    Inscription : Avril 2005
    Messages : 2 524
    Points : 5 184
    Points
    5 184
    Par défaut
    ok, je vais me coltiner la doc
    sinon j'ai trouvé un outil qui semble intéressant : RxSandbox
    pas encore eu le temps de tester mais ça peut servir à d'autres

    et encore merci pour ton aide
    Tutoriels OpenGL
    Je ne répondrai à aucune question en MP
    - Si c'est simple tu dis que c'est compliqué et tu le fait
    - Si c'est compliqué tu dis que c'est simple et tu le sous-traite ou le fait faire par un stagiaire.

  8. #8
    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 : 42
    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
    Points : 39 749
    Points
    39 749
    Par défaut
    Citation Envoyé par shenron666 Voir le message
    ok, je vais me coltiner la doc
    C'est pas si méchant que ça, vu qu'une grande partie des opérateurs sont les mêmes que dans Linq et ont la même signification . Il faut juste voir ceux qui sont spécifiques à Rx, et en général le nom indique assez clairement ce qu'ils font.

    Citation Envoyé par shenron666 Voir le message
    sinon j'ai trouvé un outil qui semble intéressant : RxSandbox
    Sympa ce truc, je connaissais pas

Discussions similaires

  1. Appeler une méthode ayant un tableau d'objets pour paramètres
    Par Phil564 dans le forum Collection et Stream
    Réponses: 1
    Dernier message: 11/12/2014, 08h03
  2. Choix d'une classe pour appel de méthodes statiques
    Par Antwan76ers dans le forum Débuter avec Java
    Réponses: 11
    Dernier message: 05/07/2012, 10h55
  3. Réponses: 3
    Dernier message: 04/02/2010, 11h03
  4. Réponses: 12
    Dernier message: 03/03/2007, 00h52
  5. Problème pour appeler une méthode d'une autre classe
    Par tse_tilky_moje_imja dans le forum Général Python
    Réponses: 7
    Dernier message: 03/03/2006, 13h33

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