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

Windows Presentation Foundation Discussion :

Thread non propriétaire


Sujet :

Windows Presentation Foundation

  1. #1
    Membre confirmé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Points : 610
    Points
    610
    Par défaut Thread non propriétaire
    Bonjour à tous,

    Je m'essaie actuellement au WPF mais je rencontre un petit soucis avec les threads.
    Lors d'un clic sur un bouton, je lance un thread qui va effectué une opération. Durant cette dernière, en cas d'erreur, je lui demande d'afficher une MsgBox ajouté grâce à la toolkit de wpf tel que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Microsoft.Windows.Controls.MessageBox.Show("toto", "Test", MessageBoxButton.OK, MessageBoxImage.Exclamation)
    Bien évidemment (), j'ai l'erreur :

    Le thread appelant ne peut pas accéder à cet objet parce qu'un autre thread en est propriétaire
    Je n'arrive pas à me débloquer...
    Merci d'avance si quelqu'un avait une idée...

    @+

  2. #2
    Invité
    Invité(e)
    Par défaut
    Utilises-tu une instance de la classe BackgroundWorker ou une instance de la classe Thread ?

  3. #3
    Rédacteur
    Avatar de Nathanael Marchand
    Homme Profil pro
    Expert .Net So@t
    Inscrit en
    Octobre 2008
    Messages
    3 615
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Expert .Net So@t
    Secteur : Conseil

    Informations forums :
    Inscription : Octobre 2008
    Messages : 3 615
    Points : 8 082
    Points
    8 082
    Par défaut
    Tous les objets d'interface utilisateur doivent être modifié par le thread de la gui.
    Voit du côté du Application.Current.Dispatcher.Invoke()

  4. #4
    Membre confirmé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Points : 610
    Points
    610
    Par défaut
    Citation Envoyé par h2s84 Voir le message
    Utilises-tu une instance de la classe BackgroundWorker ou une instance de la classe Thread ?
    une instance de la classe Thread
    j'ai essayé vite fait avec un backgroundworker mais j'ai eu une erreur "thread non STA"
    je suis donc revenu sur les threads classiques

    merci pour vos réponses

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par koyot3 Voir le message
    une instance de la classe Thread
    alors la méthode de PitMaverick78 est envisageable.

    Citation Envoyé par koyot3 Voir le message
    j'ai essayé vite fait avec un backgroundworker mais j'ai eu une erreur "thread non STA"
    t'as du mal implémenter le BackgroundWorker.
    Si t'avais réussi tu pourrais récupérer, dans le gestionnaire de l'évènement RunWorkerCompleted, récupérer le type ainsi que le message de l'exception soulevée lors du déroulement du thread.

  6. #6
    Membre confirmé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Points : 610
    Points
    610
    Par défaut
    merci pour ces précisions...

    j'ai retenté le backgroundworker et ça marche ...
    seul hic je n'arrive pas à accéder à mes contrôles par exemple pour récupérer la valeur d'une textbox ou compléter une liste !

    Peut être quelqu'un a-t-il une idée ?
    OU alors je dois aussi rajouter le application.current.dispatcher...

  7. #7
    Membre expert
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    2 210
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2004
    Messages : 2 210
    Points : 3 015
    Points
    3 015
    Par défaut
    Tu peux accéder à tes contrôles dans les évènements RunWorkerCompleted et ProgressChanged.
    Dans DoWork tu ne peux pas, par contre tu peux passer des arguments à cet évènement.

    Tu as un article ici qui parcourt le BackgoundWorker :
    http://glarde.developpez.com/dotnet/bgworker/cs/

  8. #8
    Membre confirmé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Points : 610
    Points
    610
    Par défaut
    merci binoo

    pour info (ceux qui auraient un pb avec), pour passer mes arguments, je fais

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim arguments() As String = {"str1", "str2"}
    backgdWorker.RunWorkerAsync(arguments)
    et pour les récupérer

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Dim _str1 As String = DirectCast(e.Argument, String())(0)
    Dim _str2 As String = DirectCast(e.Argument, String())(1)
    je vais voir pour essayer de modifier mes contrôles durant l'exécution

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par koyot3 Voir le message
    je vais voir pour essayer de modifier mes contrôles durant l'exécution
    Pour modifier tes controles durant l'exécution du thread en l'occurrence dans le gestionnaire d'évènement DoWork tu dois passer par le Dispatcher de l'UI (dont l'instance est récupérable via Application.Current.Dispatcher).

  10. #10
    Membre confirmé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Points : 610
    Points
    610
    Par défaut
    Aurais-tu un exemple pour assigner ou récupérer la valeur à une textbox ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Current.Dispatcher.Invoke(New MyDelegate(AddressOf MyMethode), MyParam1)
    J'utilise ça pour mon cas à savoir ouvrir une popup mais je n'arrive pas à partir d'un composant pour récupérer une valeur

    Par avance, MERCI

  11. #11
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par koyot3 Voir le message
    Aurais-tu un exemple pour assigner ou récupérer la valeur à une textbox ?
    Exemple 1 :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Current.Dispatcher.Invoke(new Action(() => { this.myTextBox.Text = "ma nouvelle valeur pour le textbox"; }));

    Exemple 2 :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    Application.Current.Dispatcher.Invoke(new Action(ChangeMyValue));
     
    // où ChangeMyValue a pour définition
     
    private void ChangeMyValue()
            {
                this.myTextBox.Text = "ma nouvelle valeur pour le textbox";
            }

    Citation Envoyé par koyot3 Voir le message
    J'utilise ça pour mon cas à savoir ouvrir une popup mais je n'arrive pas à partir d'un composant pour récupérer une valeur
    Qu'est-ce ça écrit comme erreur ?

  12. #12
    Membre confirmé Avatar de koyot3
    Inscrit en
    Avril 2007
    Messages
    693
    Détails du profil
    Informations forums :
    Inscription : Avril 2007
    Messages : 693
    Points : 610
    Points
    610
    Par défaut
    Merci pour tes extraits de code !

    Je pense que mon soucis doit venir du langage. Si je traduis ton premier code, je tombe sur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Application.Current.Dispatcher.Invoke(New Action(Function() Me.txtbox.Text = "ma nouvelle valeur pour le textbox" End Function))
    Le End laisse apparaître l'erreur :
    Virgule, ')' ou continuation d'expression valide attendue
    Il va donc falloir que je passe avec un delegate classique comme en c#, pas sur que l'autre méthode fonctionne en vb.net

  13. #13
    Invité
    Invité(e)
    Par défaut
    Désolé mais je suis nul en VB.Net donc je ne peux te dire pourquoi le premier extrait ne marche pas. Par contre le deuxième extrait devrait marcher.

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

Discussions similaires

  1. Dispatcher: Thread non propriétaire
    Par chifu dans le forum Windows Presentation Foundation
    Réponses: 11
    Dernier message: 12/07/2011, 12h07
  2. [Débutant] Thread non bloquant
    Par GoustiFruit dans le forum Langage
    Réponses: 4
    Dernier message: 28/11/2007, 17h08
  3. Erreur : Opération inter-threads non valide
    Par cadeau dans le forum C++/CLI
    Réponses: 1
    Dernier message: 12/12/2006, 09h07
  4. [Débutant] boost::thread non-lvalue
    Par Tymk dans le forum Boost
    Réponses: 16
    Dernier message: 18/11/2006, 14h23

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