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 :

Priorité sur thread mainform


Sujet :

C#

  1. #1
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2008
    Messages : 102
    Par défaut Priorité sur thread mainform
    Bonjour,

    Je suis en train de développer une application multi thread avec le backgroundWorker pour établir une communication bluetooth avec un module Mindstorm NXT. Tout va bien sauf que mon application est considérablement ralentit. J'ai une boucle while dans Mon background worker qui tourne en permanence une fois la communication etablit. Du coup j'ai l'impression que le background worker a la priorité sur le thread de la mainform et du coup mon application n'est plus fluide du tout.
    Comment rendre la priorité au thread du mainform afin que mon application reste fluide ou existe t'il un moyen de garder la main sur la mainform sans ralentir le background worker.

    merci d'avance.

  2. #2
    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 : 44
    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
    Il y une propriété Priority dans la classe Thread. Mais à mon avis le thread du BGW n'a pas une plus grande priorité que le thread de l'UI... ça doit simplement être que ta boucle bouffe du CPU inutilement. Rajoute un petit Sleep(0) dans ta boucle, histoire que le thread du BackgroundWorker rende la main plus souvent.

  3. #3
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2008
    Messages : 102
    Par défaut
    deja essayé ^^, j'avai mis un thread.sleep(250) mais aucun effet, je ne pense pas que le thread monopolise le cpu unitilement car vu le code dans le corp de la boucle while ya assez a faire XD. de plus disposant d'un intel core I7 a 2.80Ghz et le monitorant en direct il est pas surcharger du tout. a peine 10% d'augmentation sur un 1 core. par contre mon application est lente mais le reste du systeme lui est fluide c'est la que je ne comprend pas.

  4. #4
    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 : 44
    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
    Tu fais des appels au thread UI à partir de ton BGW (Invoke ou ReportProgress) ?

  5. #5
    Membre confirmé
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Juillet 2006
    Messages : 30
    Par défaut
    Salut,

    Tu pourrais utiliser la classe Thread à la place du BackgroundWorker, d'attribuer la propriété adéquate (BelowNormal genre) tel que mentionné plus haut. Si tu as besoin de faire des mises à jour sur l'état des opérations dans le UI, tu n'auras qu'à pousser ces informations sur le Thread UI depuis ton Thread de traitement.

    Qu'en penses-tu ?

  6. #6
    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 : 44
    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
    Citation Envoyé par kzrystof Voir le message
    Tu pourrais utiliser la classe Thread à la place du BackgroundWorker, d'attribuer la propriété adéquate (BelowNormal genre) tel que mentionné plus haut.
    Pas la peine de créer un thread explicitement, tu peux tout à fait le faire dans un BackgroundWorker :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Thread.CurrentThread.Priority = ThreadPriority.BelowNormal;

  7. #7
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2008
    Messages : 102
    Par défaut
    Bon j'ai essayer un peu tout, je retrouve un peu de fluidité en mettant un sleep avant l'appel du delegate mais mon appli est toujours saccader.
    voila carrément les bout des code.
    La partie delegate :
    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
    namespace NxtStatus10
    {
        public partial class MainForm
        {
            bool DistribStatusThread = false;
            bool PnPStatusThread = false;
     
            private delegate void GetDistribStatus();
     
            private void DistribStatus()
            {
                Nxt1MotorASt = Nxt1.GetOutputState(MotorPort.PortA);
                Nxt1MotorBSt = Nxt1.GetOutputState(MotorPort.PortB);
                Nxt1MotorCSt = Nxt1.GetOutputState(MotorPort.PortC);
                LblNxtDistribBatLvl.Text = string.Format("{0} mV", Nxt1.GetBatteryLevel().ToString());
                LblNxt1MotAPowerLvl.Text = Nxt1MotorASt.Power.ToString();
                LblNxt1MotAModeLvl.Text = Nxt1MotorASt.Mode.ToString();
            }
        }
    }
    et la partie mainform avec l'appelle du delegate dans la boucle du bgworker
    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
    26
    27
    28
    29
    namespace NxtStatus10
    {
        public partial class MainForm : Form
        {
          . 
          .
          .
            private void BgWkDistribStatus_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
            {
                Thread.CurrentThread.Priority = ThreadPriority.BelowNormal;
                while (DistribStatusThread)
                {
                    if (BgWkDistribStatus.CancellationPending)
                    {
                        e.Cancel = true;
                        Nxt1.Disconnect();
                        DistribStatusThread = false;
                    }
                    else
                    {
                        Thread.Sleep(300);
                        this.Invoke(new GetDistribStatus(DistribStatus));
                    }
                }
            }
            .
            .
          }
    }
    Faut il que je fasse appel a la fonction ReportProgress du bgworker et que je traite l'appel du delegate dans la parie ProgressChanged ? ou y a t'il quelque chose que j'ai encore louper ?
    merci de votre intérêt.

  8. #8
    Membre éprouvé

    Homme Profil pro
    Developpeur
    Inscrit en
    Mars 2011
    Messages
    115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Madagascar

    Informations professionnelles :
    Activité : Developpeur

    Informations forums :
    Inscription : Mars 2011
    Messages : 115
    Par défaut Reponse au Question
    Bonjour,

    Je suis en train de développer une application multi thread avec le backgroundWorker pour établir une communication bluetooth avec un module Mindstorm NXT. Tout va bien sauf que mon application est considérablement ralentit. J'ai une boucle while dans Mon background worker qui tourne en permanence une fois la communication etablit. Du coup j'ai l'impression que le background worker a la priorité sur le thread de la mainform et du coup mon application n'est plus fluide du tout.
    Comment rendre la priorité au thread du mainform afin que mon application reste fluide ou existe t'il un moyen de garder la main sur la mainform sans ralentir le background worker.
    Le fonctionnement de BackGroundWorker est limité par rapport à l'utilisation de la classe Thread. Si j'étais toi, j'utilise La Thread et utiliser XXX.Invoke(delegate) pour se communiquer avec l'UI

  9. #9
    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 : 44
    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
    Citation Envoyé par Nephi Voir le message
    voila carrément les bout des code.
    Euh... là tu fais quasiment tout le boulot sur le thread UI !
    Tout le boulot est fait dans DistribStatus, et tu exécutes cette méthode via Invoke, donc sur le thread UI... je suppose que c'est la méthode GetOutputState qui prend du temps ?

    Dans ce cas tu devrais faire comme ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            private void DistribStatus()
            {
                Nxt1MotorASt = Nxt1.GetOutputState(MotorPort.PortA);
                Nxt1MotorBSt = Nxt1.GetOutputState(MotorPort.PortB);
                Nxt1MotorCSt = Nxt1.GetOutputState(MotorPort.PortC);
                this.Invoke(new Action(UpdateUI));
            }
     
            void UpdateUI()
            {
                LblNxtDistribBatLvl.Text = string.Format("{0} mV", Nxt1.GetBatteryLevel().ToString());
                LblNxt1MotAPowerLvl.Text = Nxt1MotorASt.Power.ToString();
                LblNxt1MotAModeLvl.Text = Nxt1MotorASt.Mode.ToString();
            }
    Et appeler directement DistribStatus à partir de ton BackgroundWorker, sans Invoke. De cette façon GetOutputState sera exécuté en arrière plan, et seule la mise à jour des Labels se fera sur le thread UI.

    Citation Envoyé par fiberMan Voir le message
    Le fonctionnement de BackGroundWorker est limité par rapport à l'utilisation de la classe Thread.
    Limité en quoi ? Peux-tu préciser ta pensée ? A part le fait que tu ne peux pas préciser le ThreadApartment vu que ce n'est pas toi qui démarres le thread, je ne vois pas trop ce qu'il y a comme limite... Et le ThreadApartment, à moins que tu utilises des composants COM, tu t'en fous

  10. #10
    Membre confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Juin 2008
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Juin 2008
    Messages : 102
    Par défaut
    Bon effectivement c’était un problème de répartition des tache. je me suis fourvoyer en pensant que le delegate était exécuter par le BGWorker en non l'UI.
    Du coup c'est bon tout fonctionne impec.
    merci a vous

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

Discussions similaires

  1. priorité sur des threads
    Par kiby56 dans le forum Général Python
    Réponses: 1
    Dernier message: 24/02/2013, 17h37
  2. [LOG4J] Définir plusieurs priorités sur un projet
    Par FredKéKé dans le forum Logging
    Réponses: 1
    Dernier message: 10/01/2007, 13h18
  3. Priorités sur SQL Serveur 2000
    Par Oluha dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 12/12/2006, 16h42
  4. une question sur thread
    Par LN(a) dans le forum Delphi
    Réponses: 5
    Dernier message: 04/09/2006, 12h32

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