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

VB.NET Discussion :

Utilisation de Dispatcher.Invoke comment faire ? [Débutant]


Sujet :

VB.NET

  1. #1
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 150
    Points : 51
    Points
    51
    Par défaut Utilisation de Dispatcher.Invoke comment faire ?
    Bonjour à tous,

    J'ai un prob de thread !

    Je ne peux utiliser
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Windows.Forms.Control.CheckForIllegalCrossThreadCalls = False
    car je suis en WPF donc la méthode qui se rapproche le plus est (d'après ce que j'ai trouvé sur le net). Cependant je ne sais comment l'utiliser...

    Voici ce que j'essaye de faire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
        Public Sub ShowChart(Ordo() As Single, Absc() As Single) 
    		Dim Value As New List(Of KeyValuePair(Of Double, Double))()
    		For i As Integer = 0 To Ordo.Length-1 
    			Value.Add(New KeyValuePair(Of Double, Double)(CDbl(Absc(i)), CDbl(Ordo(i))))
    		Next
    		ChartCtrl.DataContext = Value	
    	End Sub
    Arrivé à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ChartCtrl.DataContext = Value
    ma variable Value possède bien les valeurs qui me sont nécessaires au "traçage" de ma courbe, mais rien ne se passe...
    Alors on m'a parlé de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Windows.Forms.Control.CheckForIllegalCrossThreadCalls = False
    , donc en WPF, pour pouvoir donner une priorité dans l'ordre d'affichage des opérations.


    Quelqu'un peut m'aider svp ???

  2. #2
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 155
    Points : 25 074
    Points
    25 074
    Par défaut
    CheckForIllegalCrossThreadCalls n'est pas conseillé, donc déjà en Windows forms on est censé utiliser des invoke

    en fait seul le thread principal a le droit de modifier l'interface
    et en wpf certaines variables ne peuvent être modifiées que depuis le thread les ayant créées (souvent le thread principal quand même)

    il faut donc ajouter sur le thread principal un délégué à exécuter
    c'est ce que fait invoke, il faut lui donner un pointeur vers une méthode

    en simplifié ca donne ca:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    Public Sub ShowChart(Ordo() As Single, Absc() As Single) 
        if dispatcher.current isnot application.current.dispatcher then ' = si on est pas sur le thread principal
         application.current.dispatcher.invoke(priority.normal, sub() ShowChart(Ordo, Absc)) ' on demande l'invoke de cette méthode par le dispatcher du thread principal (enfin ici c'est une méthode anonyme qui le fait et ca pourrait être n'importe quelle méthode)
         exit sub ' on sort de cette méthode, vu qu'on est pas sur le bon thread et que cette méthode a été appelé sur le bon thread par l'invoke et n'est donc pas rentré dans le if mais a fait son boulot
        end if
     
      Dim Value As New List(Of KeyValuePair(Of Double, Double))()
      For i As Integer = 0 To Ordo.Length-1 
       MyValue.Add(New KeyValuePair(Of Double, Double)(CDbl(Absc(i)), CDbl(Ordo(i))))
      Next
      ChartCtrl.DataContext = Value 
     End Sub
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 150
    Points : 51
    Points
    51
    Par défaut
    Merci énormément pour ta réponse ça me permet d'avancer !

    Et merci également pour les commentaires c'est beaucoup plus clair comme ça !!

    En revanche j'ai une exception qui me dit :
    System.Reflection.TargetInvocationException: Une exception a été levée par la cible d'un appel. ---> System.InvalidOperationException: Impossible de modifier les enfants logiques de ce nœud pour l'instant car un parcours de l'arborescence est en cours.
    (J'ai mis des breaks) Le programme se lance normalement, rentre bien dans le If, puis passe sur
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Current.Dispatcher.Invoke(DispatcherPriority.Normal, Sub() ShowChart(Ordo, Absc))
    puis revient au début du If donc
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    If Dispatcher.CurrentDispatcher IsNot Application.Current.Dispatcher Then
    puis sort du If par End If, le programme suit son cours et arrive bien jusqu'à
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ChartCtrl.DataContext = Value
    (Value possède bien les valeurs nécessaire pour tracer ma courbe) puis enfin j'ai cette exception et le programme s'arrête....

    Je ne vois pas ce que je dois faire ?

  4. #4
    Expert éminent sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 155
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 155
    Points : 25 074
    Points
    25 074
    Par défaut
    essaye autre chose que normal, genre binding (ou les autres)
    peut etre qu'il te dis ca car wpf est en train d'essayer de construire la structure du rendu et que tu ne peux pas modifier à ce moment là vu qu'il est en train de le lire

    ou alors tu es toi même en train de lire ce qui appartient au datacontext quelque part
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Membre du Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2017
    Messages
    150
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2017
    Messages : 150
    Points : 51
    Points
    51
    Par défaut
    essaye autre chose que normal, genre binding (ou les autres)
    Oui j'ai essayé avant poster ma question.

    peut etre qu'il te dis ca car wpf est en train d'essayer de construire la structure du rendu et que tu ne peux pas modifier à ce moment là vu qu'il est en train de le lire

    ou alors tu es toi même en train de lire ce qui appartient au datacontext quelque part
    Oui très intéressant ce que tu dis, je vais voir de ce côté alors et je reviens ici.

    Merci encore pour l'aide apporté !


    Edit :

    Fonctionne parfaitement !!
    Je me suis trompé sur le ChartCtrl.DataContext = Value il fallait en fait que je fasse A.DataContext = Value avec "A" le nom de ma Lineseries.
    Donc ta méthode est parfaite, on arrive bien à récup le thread principal et la courbe est tracée. La courbe se rafraîchit très lentement j'ai "seulement" environs 1000 points et lorsque je regarde le gestionnaire de tâches, processus, il s'avère que mon logiciel bouffe pas mal de ram et surtout utilise 25% de mon processeur ce qui est énorme ! Je vais essayer de comprendre pourquoi.

    Encore une fois merci beaucoup !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Probleme utilisation du Dispatcher.Invoke
    Par titou640 dans le forum C#
    Réponses: 1
    Dernier message: 28/08/2012, 09h32
  2. Utiliser MyBatis avec NetBeans, comment faire ?
    Par bkwaadbk dans le forum Persistance des données
    Réponses: 1
    Dernier message: 08/04/2012, 16h45
  3. utilisation dynamique de dir(), comment faire ?
    Par N.tox dans le forum Général Python
    Réponses: 6
    Dernier message: 11/06/2008, 00h09
  4. Réponses: 12
    Dernier message: 12/04/2006, 14h27
  5. Comment faire pour savoir quel processus utilise un DLL
    Par Furius dans le forum Autres Logiciels
    Réponses: 1
    Dernier message: 02/11/2005, 18h03

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