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

Silverlight Discussion :

[Thread] Traitement lourd a intervale régulier


Sujet :

Silverlight

  1. #1
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Points : 1 257
    Points
    1 257
    Par défaut [Thread] Traitement lourd a intervale régulier
    Bonsoir

    J'aimerai implémenter un traitement lourd (0,5 s / 1 s) toutes les X s.

    Ces traitement modifie des objets qui servent de datacontext a certains composant de l'UI.

    J'ai commencé par faire un timer qui exécute le traitement a intervalle régulier (dans un autre thread).

    Mais j'ai remarqué que l'UI ne changeait pas ... et oui cette histoire d'accès à l'UI uniquement par le thread "pére" de l'UI ... zut ...

    Bon alors je suis allé voir coté dispatcher mais ce que j ai compris c'est que le traitement est dans le même thread que l UI donc ralentissement de l UI obligatoire avec un tache trop lourde (a priori c'est la même chose pour le DispatcherTimer).

    Ensuite j'ai vu le background worker qui pourrait peut être faire ce que je souhaite mais je ne sais pas comment l'utiliser à la manière d'un timer...

    Si vous avez des conseils

    Merci et bonne soirée

  2. #2
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Et si tu mixes DispatcherTimer et BackgrounWorker ?

  3. #3
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Points : 1 257
    Points
    1 257
    Par défaut
    Ah bin oui rien ne l'empêche a priori, je vais tester merci

  4. #4
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Points : 1 257
    Points
    1 257
    Par défaut
    Bon dans mon worker dés que je veux modifier une propriété d'un objet qui est databindé (qui hérite de "EntityObject" (class généré) qui hérite de "StructuralObject" (class généré) qui implémente INotifyPropertyChanged)

    J'ai un :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    An exception of type 'System.UnauthorizedAccessException' occurred in System.Windows.dll but was not handled in user code
     
    Additional information: Invalid cross-thread access
    c'est galère ...

    je me demande si je devrait pas créer uen copie de l'objet dans l'autre thread et le manipuler puis copier les résultat dans l'objet databindé mais c un peu casse b...

  5. #5
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Etrange car normalement, le DispatcherTimer est censé éviter d'avoir des erreurs de ce type lorsqu'on veut accèder à un élément de l'interface depuis un autre Thread.

  6. #6
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Points : 1 257
    Points
    1 257
    Par défaut
    jte montre comment j'ai fait, c'est peut être (probablement) pas bon.


    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
            private DispatcherTimer localDispatcherTimer;
            private BackgroundWorker localWorker;
     
            public RealTimeManager()
            {
                localDispatcherTimer = new DispatcherTimer();
                localWorker = new BackgroundWorker();
                localWorker.DoWork += new DoWorkEventHandler(LocalDoWork);
                localWorker.RunWorkerCompleted += new RunWorkerCompletedEventHandler(LocalWorkerCompleted);
                localDispatcherTimer.Tick += new EventHandler(LocalTimerTick);
                localDispatcherTimer.Interval = new TimeSpan(5000000);
                localDispatcherTimer.Start();
            }
     
            void LocalTimerTick(object sender, EventArgs e)
            {
                if (!localWorker.IsBusy)
                    localWorker.RunWorkerAsync();
            }
     
            void LocalDoWork(object sender, DoWorkEventArgs e)
            {
                 //Traitements sur les objets
            }

  7. #7
    Rédacteur
    Avatar de Thomas Lebrun
    Profil pro
    Inscrit en
    Octobre 2002
    Messages
    9 161
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France

    Informations forums :
    Inscription : Octobre 2002
    Messages : 9 161
    Points : 19 434
    Points
    19 434
    Par défaut
    Attention, je viens de relire ton message:

    Bon dans mon worker dés que je veux modifier une propriété d'un objet qui est databindé
    Tu peux accéder à l'interface depuis le DispatcherTimer, pas depuis le BGWorker

  8. #8
    Membre éprouvé Avatar de anthyme
    Homme Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 559
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 559
    Points : 1 257
    Points
    1 257
    Par défaut
    Oui c'est bien ce qu'il me semblait...

    et l'événement RunWorkerCompleted si je m'y abonne dans le constructeur de mon objet, la méthode sera bien exécuté par mon thread UI ou par le thread qui leve l'événement (a priori le thread du worker).

    J'espere que c'est dans le thread UI ... EDIT : A priori oui

    Si il faut que je fasse des copie tant pis je les ferai mais il faut bien qu'a un moment je récupère les information généré

    EDIT : si quelqu'un a une meilleur solution : je laisse le thread ouvert

Discussions similaires

  1. [C++/VB.Net]Optimiser des traitements lourds
    Par NiamorH dans le forum Windows Forms
    Réponses: 8
    Dernier message: 28/05/2006, 10h03
  2. Réponses: 4
    Dernier message: 15/05/2006, 12h38
  3. [TOMCAT][SERVLETS] Traiments en batch a intervalles régulier
    Par azpublic dans le forum Tomcat et TomEE
    Réponses: 1
    Dernier message: 21/03/2006, 10h06
  4. Réponses: 4
    Dernier message: 25/02/2006, 14h54
  5. Traitement à intervalle régulier
    Par jagboys dans le forum MFC
    Réponses: 2
    Dernier message: 04/07/2005, 23h20

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