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#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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.

+ 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