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 Forms Discussion :

[Multithreading] Comment modifier un contrôle sur un thread séparé.


Sujet :

Windows Forms

  1. #1
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 4
    Points : 1
    Points
    1
    Par défaut [Multithreading] Comment modifier un contrôle sur un thread séparé.
    Bonjour,

    je suis très ennuyée, j'ai un programme qui, quand on appuie sur un bouton, doit ajouter quelques 360.000 mots a une listbox. C'est très long, et l'interface freeze pendant 20 secondes. Je voudrais pouvoir exécuter cette tâche sur un thread séparé, donc je déclare un nouveau thread

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
      Dim TestThread As New System.Threading.Thread(AddressOf chargefond)
    ou chargefond représente la fonction qui ajoute les mots

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     sub chargefond()
         For i = 0 To nbmot 
                ListBox1.Items.Add(list.Item(i))
            Next
        End sub
    Mais, bien que le code contenu dans chargefond s'exécute, il n'ajoute rien dans la listbox, je ne comprends pas le problème.

    J'ai aussi essayé avec un BackgroundWorker, mais la aussi ça exécutait le code mais ne résolvait rien.
    J'ai recherché sur le net et j'ai trouvé des informations sur des méthodes comme invoke, mais je suis nouvelle sur VB et j'avoue ne pas comprendre grand chose à ça
    Pouvez-vous m'aider?

  2. #2
    Expert confirmé
    Avatar de Kropernic
    Homme Profil pro
    Analyste / Programmeur / DBA
    Inscrit en
    Juillet 2006
    Messages
    3 932
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : Belgique

    Informations professionnelles :
    Activité : Analyste / Programmeur / DBA
    Secteur : Distribution

    Informations forums :
    Inscription : Juillet 2006
    Messages : 3 932
    Points : 4 242
    Points
    4 242
    Par défaut
    Il faut ensuite appeler TestThread.Start pour lancer le traitement que le thread doit faire.

    Mais de toute façon, cela ne fonctionnera pas car on ne peut pas accéder a des contrôles de l'IU à partir d'un thread autre que le principale.

    Je crois qu'il y a un moyen en utilisant un backgroundworker mais j'peux pas t'en dire plus. Je ne l'ai utiliser qu'une seule fois donc j'sais pas par coeur. Y a une présentation de ce composant sur site qui est très bien fait. Chercher de ce côté là.

    Griftou.
    Kropernic

  3. #3
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Je suis contente je crois que j'ai trouvé un début de réponse ^^

    Si j'ajoute
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     Control.CheckForIllegalCrossThreadCalls = False
    Devant l'appel de mon backgroundworker ou de mon thread, ben ça fonctionne!!
    C'est sur que ça n'a pas l'air très élégant, donc j'aimerais quand même savoir si on peut le faire grâce à des méthodes comme invoke()

    merci

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Je réponds sans doute pas à la question technique (hum la réponse est oui ) mais 360.000 mots dans une list Box est-ce bien raisonnable? Niveau design de l'interface on foit pouvoir mieux faire...

  5. #5
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Autre chose, la doc de Control..::.CheckForIllegalCrossThreadCalls explique :

    When a thread other than the creating thread of a control tries to access one of that control's methods or properties, it often leads to unpredictable results. A common invalid thread activity is a call on the wrong thread that accesses the control's Handle property. Set CheckForIllegalCrossThreadCalls to true to find and diagnose this thread activity more easily while debugging. Note that illegal cross-thread calls will always raise an exception when an application is started outside the debugger.
    Autrement dit ça ne fonctionne qu'en debug, car les accès aux contrôles depuis un autre thread que le "possesseur" sont dangereux. Il va donc falloir utiliser des Invoke.

  6. #6
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Sphax Voir le message
    Autre chose, la doc de Control..::.CheckForIllegalCrossThreadCalls explique :



    Autrement dit ça ne fonctionne qu'en debug, car les accès aux contrôles depuis un autre thread que le "possesseur" sont dangereux. Il va donc falloir utiliser des Invoke.
    Arf ça ne m'arrange pas ça ^^

    Pour les 360.000 mots, c'est tout simplement un dictionnaire complet. Je ne suis pas vraiment obligée de le faire, mais je préfère pour bien montrer que tous les mots sont la.

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Citation Envoyé par Laurelia Voir le message
    Arf ça ne m'arrange pas ça ^^

    Pour les 360.000 mots, c'est tout simplement un dictionnaire complet. Je ne suis pas vraiment obligée de le faire, mais je préfère pour bien montrer que tous les mots sont la.
    Je sais pas ce que ça va donner uniquement pour ajouter des items dans une listBox sans aucun traitement, mais bon, le principe du InvokeRequired/Invoke est assez simple. Jette un oeil à la documentation en ligne pour comprendre, si t'y arrives pas reviens dans le coin.

  8. #8
    Nouveau Candidat au Club
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    4
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 4
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Sphax Voir le message
    Je sais pas ce que ça va donner uniquement pour ajouter des items dans une listBox sans aucun traitement, mais bon, le principe du InvokeRequired/Invoke est assez simple. Jette un oeil à la documentation en ligne pour comprendre, si t'y arrives pas reviens dans le coin.
    Ben quand je regarde ici :http://msdn.microsoft.com/fr-fr/libr...6b(VS.80).aspx
    et surtout le code d'exemple donné:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    Public Class MyThreadClass
       Private myFormControl1 As MyFormControl
     
       Public Sub New(myForm As MyFormControl)
          myFormControl1 = myForm
       End Sub 'New
     
       Public Sub Run()
          ' Execute the specified delegate on the thread that owns
          ' 'myFormControl1' control's underlying window handle.
          myFormControl1.Invoke(myFormControl1.myDelegate)
       End Sub 'Run
     
    End Class 'MyThreadClass
    j'avoue ne pas saisir le truc^^

    Il faudrait mettre un delegate dans ma form (subdel par exemple), avoir la fonction a part qui fait les traitements sur la listbox, mais après?

  9. #9
    Membre averti
    Avatar de Cyrilange
    Profil pro
    Inscrit en
    Février 2004
    Messages
    268
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2004
    Messages : 268
    Points : 337
    Points
    337
    Par défaut
    Utilises un BackGroundWorker avec un Delegate :

    Exemple içi :
    http://cyrilhome.over-blog.net/article-13916520.html

Discussions similaires

  1. Comment modifier un contrôle depuis une classe ?
    Par pot2yaourt dans le forum Windows Forms
    Réponses: 2
    Dernier message: 25/07/2009, 15h01
  2. Réponses: 4
    Dernier message: 03/07/2007, 11h21
  3. [Etat-Transition] Comment modifier les priorité sur les transitions?
    Par furinkazan dans le forum Autres Diagrammes
    Réponses: 1
    Dernier message: 25/05/2007, 14h44
  4. Comment modifier les droits sur un répertoire ?
    Par rattlehead dans le forum Framework .NET
    Réponses: 4
    Dernier message: 19/10/2006, 14h42
  5. Réponses: 5
    Dernier message: 23/05/2006, 15h25

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