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 :

Progressbar + multi fenêtrage


Sujet :

Windows Forms

  1. #1
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 9
    Points : 7
    Points
    7
    Par défaut Progressbar + multi fenêtrage
    Bonjour,

    mon problème est le suivant :

    j'execute une tâche assez lourde et je la lance via un bouton sur ma fenêtre principale (on va l'appeler fenêtre1 pour la compréhension). Lorsque je clique sur ce bouton, cela lance dans un nouveau thread une autre fenêtre (fenêtre2) comprenant uniquement la progressbar et un label.

    Je fais dormir ce thread pendant 100ms tant que la tâche principale n'est pas finie et toutes les 100ms je mets à jour ma progressbar et mon label.

    Le problème se situe au niveau du fait que lorsque ma fenêtre2 (celle avec la progressbar) perd le focus, elle se gèle et une autre fenêtre similaire s'ouvre (fenêtre3) sous celle-ci et se met à bien à jour, elle. Par contre on ne peut ni déplacer, ni réduire la fenêtre3, elle semble "incruster" dans fenêtre1.

    Je précise que fenêtre2 a la propriété TopMost à true.

    J'aimerais donc que fenêtre2 ne se gèle pas et que fenêtre3 n'apparaisse pas.

    Quelqu'un peut-il m'aider ?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Bonjour Masacc,

    ca va peut etre paraitre bete, mais a tout hasard comment tu lances ta Form au debut de l'operation ? j'entends par la est-ce que dans la methode de lancement du thread, tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Form f = new Form();
    f.Show(this);
    ou bien

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Form f = new Form();
    Application.Run(f);
    Si tu fais comme le premier code, alors oui c'est normal que ta fenetre ait l'air gelée, car tu boucles juste sur la mise à jour de tes controles, mais ce n'est pas une boucle de message classique de Form (qui est bien presente quand tu lances par Application.Run(Form)). Avec juste un Show, la fenetre devrait se fermer immediatement, puisque le thread n'a pas de pompe de messages (pas ici puisque tu dois avoir un while(operation_pas_finie), ce qui bloque sa fermeture).

    Pour le fait de l'ouverture multiple, en cas de perte de focus, je suppose que ca doit venir de ton code, pourrait-on avoir la partie en question ?

  3. #3
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Salut SirJulio,

    voila le code que j'execute dans la fenêtre principale (fenêtre1)

    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
     
     
    // <summary>
    /// Méthode qui permet de lancer la tache lourde
    /// </summary>
    void Button1Click(object sender, System.EventArgs e)
    {
    	//on rend la fenêtre principale indisponible
    	this.Enabled = false;
     
    	//on crée le thread de la fenêtre d'attente
    	Thread t = new Thread(new ThreadStart(lancerIhma));
     
                 //on lance le thread de la fenêtre d'attente
    	t.Start();
     
                 //traitement tache lourde..........................
     
                 //on tue le thread de la fenêtre d'attente
    	t.Abort();
     
    }
     
     
    /// <summary>
    /// Méthode qui permet de lancer la fenêtre d'attente.
    /// </summary>
    public void lancerIhma(){
    	IHM_attente ihma = new IHM_attente();
     
                 //cette ligne n'existait pas avant ton commentaire mais le résultat est le même
    	System.Windows.Forms.Application.Run(ihma);
     
    	ihma.Close();
    }
    et voila le code dans la fenêtre d'attente (fenêtre2)

    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
     
    public IHM_attente()
    {
     
    	InitializeComponent();
    	while(!IHM.generationFinie){
    		this.Show();
    		this.Update();
    		this.majProgressBar();
                  	Thread.Sleep(100);
                }
    }
     
     
    /// <summary>
    /// Méthode qui met à jour la bar de progression.
    /// </summary>
    private void majProgressBar(){
     
    	int pourcent =0;
     
    	if(ModeleGlobal.nbExigencesTraitees != 0){
    		int min = ((ModeleGlobal.nbExigencesATraiter - ModeleGlobal.nbExigencesTraitees)/60);
    		int seconde = ((ModeleGlobal.nbExigencesATraiter - ModeleGlobal.nbExigencesTraitees)%60);
    		if((min == 0) && (seconde == 0)){
    		label2.Text = "Sauvegarde du document...";
    	            }
    	             else{
    		           label2.Text = "temps restant : environ " + min + "min" + seconde + "s";
    	             }
     
    	              pourcent = (int)(100*ModeleGlobal.nbExigencesTraitees/ModeleGlobal.nbExigencesATraiter);
                 }
    	this.progressBar1.Value = pourcent;
    }
    ModeleGlobal.nbExigencesATraiter et ModeleGlobal.nbExigencesTraitees sont des variables public static d'une classe de qui execute ma tache lourde. Le traitement d'un exigence prend environ 1s, ce qui sert juste à avoir une idée approximative du temps restants (rien de précis la dedans et ce n'est pas le but d'ailleurs...).


    Au début je n'avais pas mis la ligne Application.Run(ihma) mais je n'ai vu aucun changement en la rajoutant du fait du this.Show() dans IHM_attente().

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    Salut Masacc,

    le probleme vient de la boucle du thread. En fait tu enfermes le thread de ta form dans une boucle sans fin qui est sensée se terminer au moment de la fin de l'operation, mais a aucun moment ce thread ne peut reconstuire l'affichage autre la progressbar ou le label (qui sont pris en charge par ta fonction), donc si tu bouges ou redimmensionne, ca "gele". Le mieux à faire etant, AMHA, de faire un timer dans la form de progrès qui mettra à jour les informations, et fermera la fenetre si l'operation est finie. Ce qui donnerai :


    MainForm :
    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
     
        public partial class MainForm : Form
        {
            public MainForm()
            {
                InitializeComponent();
            }
     
            private void button1_Click(object sender, EventArgs e)
            {
                Thread progressThread = new Thread(
                    delegate(object state)
                    {
                        ProgressForm f = new ProgressForm();
                        //On lance le thread de la form de progrès
                        Application.Run(f);
                        //Au retour de Run, on dispose la form
                        f.Dispose();
                    });
                 progressThread.Start();
            }
        }
    ProgressForm :

    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
        public partial class ProgressForm : Form
        {
            System.Timers.Timer myTimer = new System.Timers.Timer(100);
     
            public ProgressForm()
            {
                InitializeComponent();
                //Pour invoker directement le callback dans le thread du control et pas dans un thread du pool
                myTimer.SynchronizingObject = this;
                myTimer.Elapsed += 
                    delegate(object sender, System.Timers.ElapsedEventArgs e)
                    {
                        if (/*MonOperation != finie*/)
                        {
                            //Mise à jour progressbar et label
                        }
                        else
                            //Si l'operation est terminée on sort de la boucle de message
                            Application.ExitThread();
                    };
                myTimer.Start();
            }
        }
    Maintenant ta form de progression devrait se comporter correctement et verifiant toutes les 100ms l'avancement ou la fin de l'operation (et se ferme le cas echeant).

    En esperant que cela t'aide. =)

    edit : correction d'erreurs dans le code

  5. #5
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Salut SirJulio,

    merci pour ta réponse complete mais malheureusement, la ProgressFrom ne s'affcihe plus maintenant... J'ai bien essayé de placer des f.Show() à plusieurs endroits, mais rien de mieux

    Une idée ?

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    547
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 547
    Points : 627
    Points
    627
    Par défaut
    J'ai commis une erreur dans le code du dessus, j'ai oublié de faire un Start sur le thread de la forme de progression. J'edite tout de suite. Peut etre cela vient de la.

    Si ce n'est pas ca, je t'avoue que je comprends pas, je viens d'essayer et ca marche parfaitement, j'essaie d'y reflechir. =)

  7. #7
    Futur Membre du Club
    Inscrit en
    Juillet 2007
    Messages
    9
    Détails du profil
    Informations forums :
    Inscription : Juillet 2007
    Messages : 9
    Points : 7
    Points
    7
    Par défaut
    Merci SirJulio, ça marche parfaitement!

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

Discussions similaires

  1. question sur le multi fenêtrage
    Par greg08 dans le forum Agents de placement/Fenêtres
    Réponses: 3
    Dernier message: 20/11/2008, 11h03
  2. Gestion multi fenêtrage
    Par irongomme dans le forum Windows Forms
    Réponses: 13
    Dernier message: 30/10/2007, 00h40
  3. navigation en Multi-fenêtrage
    Par gotcha5832 dans le forum Général JavaScript
    Réponses: 3
    Dernier message: 13/05/2007, 23h20
  4. Glut Multi Fenêtrage
    Par maxetime dans le forum GLUT
    Réponses: 11
    Dernier message: 02/10/2006, 13h47
  5. Problème de multi-fenêtrage
    Par mojojojo dans le forum Général JavaScript
    Réponses: 1
    Dernier message: 28/06/2006, 16h24

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