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

C# Discussion :

BackgroundWorker ou Thread


Sujet :

C#

  1. #1
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut BackgroundWorker ou Thread
    Bonjour,

    je vous expose mon problème j'ai une appli qui contrôle la souris, mais j'utilise des thread.sleep lors des déplacements pour éviter que le déplacement soit instantané.
    Le problème c'est que quand je fais ça il n'est plus possible d'accéder a le fenêtre de l'appli celle-ci n'affiche plus rien, je pensais qu'en exécutant les fonctions dans un nouveau thread j'aurais pas ce genre de problème, mais c'est toujours la même chose.
    Suis-je obligé d'utiliser le backgroundworker ou tout autre objet pour continuer à avoir accès a la fenêtre lors de thread.sleep ou c'est possible en utilisant les thread ?

  2. #2
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Si tu fait un Thread.Sleep sur le thread principal tu bloques l'affichage, car le thread principal est justement celui chargé de l'affichage.

    Tu dois donc créer un thread pour effectuer ton traitement, afin de laisser le thread principal tranquille. Le BackgroundWorker utilise aussi un thread donc tu peux également t'en servir, c'est à toi de voir ce qui te semble le plus simple.

    Tu trouveras tout ce qu'il te faut en cherchant un peu sur ce forum et avec les tutos du site

  3. #3
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut
    voila ce que je fait

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
      // fonction délégué pour le déplacement
            private delegate void deplacer(object param);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    // on invoke la fonction deplacer
            private void startDeplacer(object param)
            {
                Invoke((deplacer)fonction.deplacer,param);
            }
    ma fonction qui lance le nouveau thread
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
                        if (ckDepla.Checked)
                        {
                            Point posParam = positionElement(element.Text);
                            object[] param1 = new object[] { processus, posParam.X, posParam.Y };
                            dep = new Thread(new ParameterizedThreadStart(startDeplacer));
                            dep.Start(param1);
     
                        }


    et pourtant la fenêtre de l'appli n'est pas accessible

  4. #4
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Parce que dans ta méthode startDeplacer tu exécutes tout le code via Invoke, et la méthode Invoke à pour but d'exécuter le code sur le thread graphique. Résultat, le thread ne sert à rien en l'état.

    Tu ne dois appeler Invoke que pour les modifications de la partie graphique et seulement à ce moment. En gros, si j'ai bien compris, le corps de ta méthode startDeplacer devrait ressembler à quelque chose comme
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Faire
       Invoke(déplacer curseur)
       Sleep()
    Tant que la souris doit être déplacée
    La mise en pause du thread n'est pas dans le Invoke ainsi, ce qui ne bloque pas le thread graphique.

  5. #5
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut
    arf je savais pas merci pour l'info j'utilise l'invoke parce que je transmet une combobox et les composant winforms sont thread safe
    donc si j'utilise plus l'invoke et j'appelle directement la fonction dans mon new thread je n'aurais plus ce problème?
    si oui alors je modifierai mon code pour plus communiquer mon combobox mais l'info qui m’intéresse par l'intermédiaire d'une string

  6. #6
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Tu dois utiliser Invoke dès que tu veux modifier la partie graphique (texte d'une TextBox, propriété Enabled d'un contrôle...) depuis un autre thread que le thread principal. Sinon tu n'en as pas besoin.

  7. #7
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut
    thank you je vais faire ça, moi j'ai besoin de récupérer juste des valeurs pas de les modifier

  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 : 43
    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
    Par défaut
    C'est pas seulement pour modifier les valeurs, aussi pour les récupérer... En gros dès que tu veux accéder à un contrôle (en lecture ou en écriture), tu dois passer par Invoke

  9. #9
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut
    si je fais:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    if (ckDepla.Checked)
                        {
                            Point posParam = positionElement(element.Text);
                            String value= processus.Text;
                            object[] param1 = new object[] { value, posParam.X, posParam.Y };
                            dep = new Thread(new ParameterizedThreadStart(startDeplacer));
                            dep.Start(param1);
     
                        }
    ça marchera ?(je récupère le text de ma combobox et c'est la string que je transmet en paramètre)

  10. #10
    Membre expérimenté
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Par défaut
    Citation Envoyé par tomlev Voir le message
    C'est pas seulement pour modifier les valeurs, aussi pour les récupérer...
    Je ne m'en suit jamais servi dans ce sens, n'en ayant pas eu le besoin, et il est vrai que j'ai complétement zappé ce point au final

    Citation Envoyé par youtpout978 Voir le message
    si je fais:
    ...
    ça marchera ? (je récupère le text de ma combobox et c'est la string que je transmet en paramètre)
    Tu n'es pas dans le thread à ce moment, donc aucun souci.

  11. #11
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut
    merci pour l'aide les gars maintenant je serais qu'il faut pas utiliser l'invoke si j'ai besoin du thread graphique, mais sinon si je lance plusieurs thread par l'intermédiaire d'invoke ils sont tous executé ensemble sur la partie graphique ?

  12. #12
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut
    voilà j’exécute ma fonction directement dans un nouveau thread, mais je voudrais attendre que le thread finisse pour faire la suite des actions sans pour autant bloqué le thread graphique

    J'exécute mes 2 fonctions dans un seul thread, je voulais savoir comment interrompre ce thread une foi lancé parce que le suspend ou abort empêche pas ma fonction de continuer à s'éxecuter

  13. #13
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    Le plus propre est d'ajouter, au sein de ta boucle, une vérification sur un membre (par exemple : "stop") qui serait modifié par un autre thread pour ordonner l'arrêt. Si le membre est vrai, tu quittes la boucle.

  14. #14
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut
    arf ça va être dur d'intégrer ça

    Voila l'appel de mon thread
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Point posParam = positionElement(element.Text);
                            IntPtr fenflyff = getHandle(processus);
                            bool depla = ckDepla.Checked;
                            bool eveil = ckEveil.Checked;
                            object[] param1 = new object[] { fenflyff, posParam.X, posParam.Y, depla, eveil };
                            dep = new Thread(new ParameterizedThreadStart(fonctionIntermediaire));
                            dep.Start(param1);
    la c'est la fonction appelant mes 2autres fonctions
    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
     
    // Permet d'appeler la fonction d'eveil et de deplacement dans le même thread
            private void fonctionIntermediaire(object param)
            {
                // on récupère tous les paramètres
                object[] getParam = (object[])param;
                IntPtr fenflyff=(IntPtr)getParam[0];
                int x = (int)getParam[1];
                int y = (int)getParam[2];
                bool depla = (bool)getParam[3];
                bool eveil = (bool)getParam[4];
                // on execute les fonctions choisit avec les bons paramètre
                if (depla)
                {
                    object[] param1 = new object[] { fenflyff, x, y};
                    fonction.deplacer(param1);
                }
     
                if (eveil)
                {
                    object param2 = fenflyff;
                    fonction.eveiller(param2);
                }
     
            }
    tu verrais un moyen d'intégrer ça

  15. #15
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    J'ai l'impression que tu n'as pas utilisé de boucle tant que mais plutôt de la récursivité, je me trompe ? Genre "intermédiaire" appelle soit "éveille" soit "déplacement" et ces deux-là rappellent à leur tour "intermédiaire" ? Si c'est le cas, c'est facile, tu dois ajouter un paramètre d'arrêt dans le tableau "getParam" (au passage, créer une classe pour stocker tout ça serait plus élégant qu'un tableau d'objets, viens-tu du php ou d'un langage de ce genre ?).

    Sinon, c'est dans la fonction ou tu as mis la boucle et, visiblement, ce n'est pas celle-ci.

  16. #16
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut
    non j'ai commencé a être formé java et c# et je me suis spécialisé dans le c#, j'ai pas fait de classe pour stocker mes paramètre vu qu'ils changent souvent et mon appli c'est limite que du procédural.
    Donc tu me demande de mettre l’arrêt dans les deux boucles que j'utilise, il y a pas une autre méthode pour forcer l'arrêt du thread même si c'est déconseillé?

  17. #17
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut
    c'est bon j'ai réussi à faire ce que je voulais
    un truc tout bête je vérifiais comme ça si le thread était lancé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (dep != null && dep.ThreadState == ThreadState.Running)
                {
                    dep.Abort();
                }
    j'ai juste eu à faire ça il devait pas le reconnaitre en tant que 'Running'
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (dep != null)
                {
                    dep.Abort();
                }
    en tou cas merci pour l'aide ;-)

  18. #18
    Membre Expert Avatar de DonQuiche
    Inscrit en
    Septembre 2010
    Messages
    2 741
    Détails du profil
    Informations forums :
    Inscription : Septembre 2010
    Messages : 2 741
    Par défaut
    De rien et désolé de ne pas t'avoir répondu, j'avais visiblement loupé la notification.

  19. #19
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut
    pas grave c'est souvent sur des truc tout bête qu'on bloque le plus étant donné qu'on cherche toujours ailleurs

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

Discussions similaires

  1. [Débutant] BackgroundWorker + Cross-Thread
    Par Whippet dans le forum C#
    Réponses: 5
    Dernier message: 02/11/2013, 13h34
  2. [Débutant] Problème backgroundworker et thread
    Par pepsi95 dans le forum VB.NET
    Réponses: 2
    Dernier message: 24/02/2012, 17h41
  3. Réponses: 4
    Dernier message: 15/06/2007, 10h41
  4. [C# THREADS]problème avec backgroundworker
    Par sarapis dans le forum Windows Forms
    Réponses: 8
    Dernier message: 15/04/2007, 11h58
  5. [WinForms]BackgroundWorker et threads
    Par b4u dans le forum Général Dotnet
    Réponses: 2
    Dernier message: 13/12/2006, 18h55

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