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 :

[C#] ProgressBar Marquee


Sujet :

Windows Forms

  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut [C#] ProgressBar Marquee
    Bonjour,

    Je n'arrive pas à comprende comment marche une progressbar en mode marquee.

    Je veux lancer une tâche dont je ne connais pas la durée et j'aimerais faire une "progressbar" qui montre qu'il faut patienter.

    Comment faire pour lancer l'animation, et ensuite écouter le retour de la métode qui lance la tâche de durée inconnue ?

    Meric pour votre aide !!!
    tout le monde est d'accord pour critiquer la pensée unique

  2. #2
    Membre habitué Avatar de PoZZyX
    Inscrit en
    Août 2005
    Messages
    426
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 426
    Points : 154
    Points
    154
    Par défaut
    Hello,

    Si j'étais toi, je lancerais au début de ton action un progress_bar.visible = true et à la fin de ton traitement un progress_bar.visible = false. Tu n'as pas besoin de connaitre le temps, puis que ça sera contenu dans ta fonction.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    Private Sub CalculsPhysiquesCompliques()
    me.progress_bar.visible = true
    ...
    me.progress_bar,visible = false
    End sub

  3. #3
    Membre habitué Avatar de PoZZyX
    Inscrit en
    Août 2005
    Messages
    426
    Détails du profil
    Informations forums :
    Inscription : Août 2005
    Messages : 426
    Points : 154
    Points
    154
    Par défaut
    Dsl j'avais pas vu que ct du C# mais ça doit etre similaire

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Bonjour PoZZyX !!

    J'ai essayé cela:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    progressBar1.Visible=true;
    Mais je ne vois rien progresser ou bouger ???
    tout le monde est d'accord pour critiquer la pensée unique

  5. #5
    Membre expérimenté Avatar de bossun
    Profil pro
    Inscrit en
    Novembre 2002
    Messages
    1 359
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : Suisse

    Informations forums :
    Inscription : Novembre 2002
    Messages : 1 359
    Points : 1 443
    Points
    1 443
    Par défaut
    pour utiliser les progressbar le mieux c'est d'utiliser le backgroundworker
    il vaut mieux prendre son pied que de se prendre la tête!!

    http://bossun.noxblog.com

  6. #6
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 30
    Points : 21
    Points
    21
    Par défaut
    Tente un truc genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    progressBar1.Visible = true;
    while (test == false)
    {
          //Fonction qui incrémente la valeure de la progressbar
          progressBar1.Value = progressBar1.Value % progressBar1.Maximum + 1;
          Thread.Sleep(50);
    }
    Le code doit être lancé dans un thread;
    Avec "test" passé à true pour arréter la boucle.

    En espérant que cela t'aide !

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Merci pour vos réponses !

    Pierre1256, j'ai fait ceci:
    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
    30
    31
    32
    33
    34
    35
     
    namespace PicsWizz
    {
        public partial class TestConnexion : Form
        {
            private string login;
            private string password;
            private bool test = false;
            public TestConnexion()
            {
                InitializeComponent();
     
            }
            public TestConnexion(string login, string password):this()
            {
                this.login = login;
                this.password = password;
                Thread T1 = new Thread(new ThreadStart(InitProgressBar));
                T1.Start();
            }
     
     
            private void InitProgressBar()
            {
                progressBar1.Visible=true;
     
                while (test == false)
                {
                    //Fonction qui incrémente la valeure de la progressbar
                    progressBar1.Value = progressBar1.Value % progressBar1.Maximum + 1;
                    Thread.Sleep(50);
                    progressBar1.Update();
                }
     
            }
    Mais malheureusment, ça bloque et j'ai l'erreur suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    Opération inter-threads non valide : le contrôle 'TestConnexion' a fait l'objet d'un accès à partir d'un thread autre que celui sur lequel il a été créé.
    Comment résoudre ce souci ???
    tout le monde est d'accord pour critiquer la pensée unique

  8. #8
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    En fait, je crois avoir à peu près compris comment me débrouiller avec le thread mais il reste un gros problème !!
    Le thread principal lance le thread T1.
    Une fois que mon thread T1 a fait son calcul comment faire pour qu'il renvoie son résultat (la valeur qu'il a trouvé par exemple) au thread principal !!!

    C'est là qu'est mon problème !!!!!

    PS: l'autre problème, c'est que je suis nul ..
    tout le monde est d'accord pour critiquer la pensée unique

  9. #9
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 30
    Points : 21
    Points
    21
    Par défaut
    Alors pour l'erreur que tu as eu, c'est normal le thread créé ne peut pas accéder à ton form d'origine.
    Pour cela il faut utiliser un delegate .... et l'appeler avec un invoke.
    C'est chiant !

    Pour ma part je lance la progressbar dans le thread principal et je fais mes calculs dans celui que je lance.

    Ensuite pour ce qui est de récupérer un résultat, il suffit de déclarer une variable (ou objet selon ce que tu souhaites avoir) public.

    Si par contre tu effectues des calculs complexes dans ton thread secondaire, je te conseille le delegate.

    Voilà

  10. #10
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Salut Pierre1256,

    C'est tout à fait ce que je compte faire: déclarer ma progressbar dans le thread principal et lancer un calcul dans le second thread.
    Cependant, j'ai besoin de retourné un résultat à mon thread principal.
    Tu as dit:
    Ensuite pour ce qui est de récupérer un résultat, il suffit de déclarer une variable (ou objet selon ce que tu souhaites avoir) public
    C'est à déclarer dans mon thread principale ? Dans le trhead fils ?

    Merci pour ton aide, je vais finir par y arriver !!!
    tout le monde est d'accord pour critiquer la pensée unique

  11. #11
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Merci grandement pour ton aide Pierre1256.
    ça fonctionne maintenant !!!
    Dans le thread principal, la progressbar et dans le secondaire ma fonction.
    Une variable est déclarée publique dans le ma classe et elle est accessible depuis le second thread.

    Voilà le code:
    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
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
     
    namespace PicsWizz
    {
        public partial class TestConnexion : Form
        {
            private string login;
            private string password;
            private int STATUT = -1;
            public string RESULTAT="";
            public TestConnexion()
            {
     
                InitializeComponent();
                Thread T1 = new Thread(new ThreadStart(Throw_WebService));
                T1.Start();
            }
            public TestConnexion(string login, string password):this()
            {
                this.login = login;
                this.password = password;
            }
     
            public void Throw_WebService()
            {
                try
                {
                    WebServiceFunctions();
                }
                catch (Exception E)
                {
                    Debug.WriteLine(E.Message.ToString());
                }
            }
     
     
            private void WebServiceFunctions()
            {
     
                Heelo_test T = new Heelo_test();
                if (T.Authentification(login, password) == "1")
                {
                    RESULTAT = "Succès d'authentification !!!";
                    STATUT = 1;
                }
                else
                {
                    RESULTAT = "Athentification refusée !!!";
                    STATUT = 0;
                }
     
            }
     
            private void Show_ProgressBar(object sender, EventArgs e)
            {
                while (RESULTAT == "")
                {
                    progressBar1.Value = progressBar1.Value % progressBar1.Maximum + 1;
                    this.Update();
                    Thread.Sleep(50);
                }
                if (STATUT == 1)
                {
                    Color col = Color.FromArgb(100, 0, 255, 0);
                    label1.ForeColor = col;
                }
                else
                {
                    Color col = Color.FromArgb(100, 125, 0, 0);
                    label1.ForeColor = col;
                }
                progressBar1.Value = 100;
                ContentAlignment Align = ContentAlignment.TopCenter;
                Size S = new Size();
                S.Width = label1.Text.Length;
                label1.Size = S;
                label1.TextAlign = Align;
                label1.Text = RESULTAT;   
     
            }
        }
    }
    Si je peux me permettre une dernière question ...
    Que ce passe t'il lorsque le thread principal lance le thread T1.
    Est-ce que tout l'espace mémoire de l'application est dupliqué pour le thread T1 ? Dans ce cas, pourquoi je peux pas accéder directement aux objets de ma form ?
    tout le monde est d'accord pour critiquer la pensée unique

  12. #12
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 30
    Points : 21
    Points
    21
    Par défaut
    Ceci est du au fait que tu utilise le framework 2.0 (Avec le 1.1 il n'y a pas ce problème) ..... C'est juste pour sécuriser le code et empécher des accès non autorisés ...


    Ps: si je peux me permettre, tu devrais plutôt déclarer ta variable RESULTAT en tant que Booleen .... c'est plus propre à mon sens et cela ne change presque rien dans ton code...

  13. #13
    Membre averti
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    801
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 801
    Points : 314
    Points
    314
    Par défaut
    Ah oui bien sûr, je vais la déclarer en boolean.

    Merci pour le complément d'informations.
    tout le monde est d'accord pour critiquer la pensée unique

  14. #14
    Membre à l'essai
    Profil pro
    Inscrit en
    Février 2006
    Messages
    30
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 30
    Points : 21
    Points
    21
    Par défaut
    De rien

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

Discussions similaires

  1. [VB.NET 2005] Progressbar en mode marquee
    Par Aspic dans le forum Windows Forms
    Réponses: 4
    Dernier message: 13/11/2006, 17h44
  2. ProgressBar en mode marquee (durée inconnue)
    Par Tenguryu dans le forum C++Builder
    Réponses: 1
    Dernier message: 23/09/2006, 17h14
  3. comment programmer une progressbar
    Par Choucas dans le forum Paradox
    Réponses: 3
    Dernier message: 13/11/2002, 11h07
  4. ProgressBar avec plusieurs procédures
    Par elifqaoui dans le forum VB 6 et antérieur
    Réponses: 8
    Dernier message: 08/09/2002, 18h03
  5. Couleur de ProgressBar
    Par benj63 dans le forum C++Builder
    Réponses: 7
    Dernier message: 04/07/2002, 17h33

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