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 :

[débutant] Mon interface se bloque


Sujet :

C#

  1. #1
    Membre éclairé Avatar de llaffont
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2007
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2007
    Messages : 702
    Par défaut [débutant] Mon interface se bloque
    Bonjour,

    Quand je lance mon traitement le résultat s'affiche à la fin lorsque l'interface est de retour disponible.

    Je suppose qu'il faut utiliser les Threads mais je nage pas très bien dans ce domaine.

    Je me demande donc :

    Déjà si le fait de lancer mes intérrogation comme suit n'est pas un peu brouillon ?

    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
     
    private void button1_Click(object sender, EventArgs e)
            {
                this.groupBox1.Show(); //affiche un Groupe contenant divers Label permettant d'afficher un etat
                affiche_lbl(null, null);// purge les label du groupes
                Stopwatch Tps1 = new Stopwatch();
                Tps1.Start();
                string Path_SRV_DollarU = @"\\" + Ip_SRV + @"\" + Partage;//Concatene divers champs afin d'obtenir un path
                this.tb_Log.Clear();//Vide le texte box contenant le résultat du fichier log
                Interrogation fichier_SRV = new Interrogation();//Initialise ma classe 
                fichier_SRV.Liaison_partage(Path_SRV_DollarU, Cpt_User, Cpt_Pass);//Ouverture du partage avec un serveur
                string [] fichier_du_jour = fichier_SRV.Interrogation_Partage(Path_SRV_DollarU);// Interrogation du partage sur la présence du fichier Log
                if (fichier_du_jour != null)//si on a un fichier
                {
                    fichier_SRV.Copy_Fichier_Log(fichier_du_jour[0]);//Copie le fichier LOG en local
                    this.lbl_Name_fichier_result.Text = fichier_du_jour[2];//Indique son nom
                    this.lbl_Date_Modif_result.Text = fichier_du_jour[1];//indique son T update
                    lecture_fichier_log();//Affiche le resultat de la lecture sur le label du GroupBox1
                }
                else
                {
                    this.groupBox1.Hide();//On cache le groupeBox
                    this.tb_Log.AppendText("Aucun fichier a la date du jour");
                    this.lbl_Name_fichier_result.Text = "Aucun fichier a la date du jour";
                }
                Tps1.Stop();
                this.lbl_Tps_Exec_result.Text = Tps1.Elapsed.Seconds.ToString()+" secondes";
     
            }
    Ensuite :

    Comment faire pour que les onglets de mon interface soit accessible lors du traitements ?

  2. #2
    Membre éclairé Avatar de Luffy49
    Profil pro
    Étudiant
    Inscrit en
    Mars 2007
    Messages
    399
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2007
    Messages : 399
    Par défaut
    Déjà insert des commentaires dans ton codes parceque c'est assez compliquer de si retrouver.

    Regarde du coter des thread , ou de BackGroundWorker , ou même de this.refresh() si ce n'est qu'une actualisation graphique que tu veut faire

  3. #3
    Membre éclairé Avatar de llaffont
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2007
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2007
    Messages : 702
    Par défaut
    Voilà j'ai mis des commentaires.

    Les deux méthodes qui prennent du temps sont Liaison_partage() et Interrogation_Partage().

    Mon interface compte 3 onglets et un bouton. J'aimerais que lorsque j'ai lancé le traitement via le bouton et qu'il est en cours pouvoir me balader d'onglet en onglet.

    Pour l'instant je suis obliger d'attendre la fin du traitement.

    S'il me faut utiliser les Thread doivent ils etre initialisé dans la méthode button1_Click() ou dans les autres ?

  4. #4
    Membre éclairé Avatar de llaffont
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2007
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2007
    Messages : 702
    Par défaut
    Bon j'ai en partie solutionné mon problème d'interface "mort" durant les traitement. Avec les threads

    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
     
    private void button1_Click(object sender, EventArgs e)
            {
                Thread t1 = new Thread(new ThreadStart(traitement));
     
                if (this.button1.Text == "Lancer")
                {
                    this.button1.Text = "Annuler";
                    this.tb_Log.Clear();
                    t1.Start();
     
                }
                else
                {
                    t1.Abort();
                    this.button1.Text = "Lancer";
                    this.tb_Log.AppendText("Opération annulée");
                    this.lbl_Name_fichier_result.Text = "Opération annulée";
                }
     
     
     
            }
    J'ai recopié mon scipt précedent dans la méthode "traitement"

    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
     
            private void traitement()
            {
                Stopwatch Tps1 = new Stopwatch(); 
                Tps1.Start();
                string Path_SRV_DollarU = @"\\" + Ip_SRV + @"\" + Partage;
                Interrogation fichier_SRV = new Interrogation();
                fichier_SRV.Liaison_partage(Path_SRV_DollarU, Cpt_User, Cpt_Pass);//Ouverture du partage 
                string[] fichier_du_jour = fichier_SRV.Interrogation_Partage(Path_SRV_DollarU);// Interrogation du partage sur la présence du fichier Log
                if (fichier_du_jour != null)
                {
                    fichier_SRV.Copy_Fichier_Log(fichier_du_jour[0]);
                    this.lbl_Name_fichier_result.Text = fichier_du_jour[2];
                    this.lbl_Date_Modif_result.Text = fichier_du_jour[1];
                    lecture_fichier_log();
                }
                else
                {
                    this.groupBox1.Hide();
                    this.tb_Log.AppendText("Aucun fichier a la date du jour");
                    this.lbl_Name_fichier_result.Text = "Aucun fichier a la date du jour";
                }
                Tps1.Stop();
                this.lbl_Tps_Exec_result.Text = Tps1.Elapsed.Seconds.ToString() + " secondes";
     
            }
    Puisque actuellement j'ai le beau message "Opération inter-threads non valide :...."

    A suivre

  5. #5
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Par défaut
    Citation Envoyé par llaffont
    Puisque actuellement j'ai le beau message "Opération inter-threads non valide :...."

    A suivre
    alors c'est que tu es sur la bonne voie

    Cette erreur vient du fait que l'on ne peut pas modifier un composant graphique à partir d'un autre thread que celui de leur création.

    Pour remédier à ce problème il existe une méthode que tout les composants ont : Invoke.

    Pour l'utiliser :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    //Soit un bouton button
    private void MaFonction(object o, EventArgs e)
    {
        if( button.InvokeRequired )
        {
             button.Invoke(new EventHandler(MaFonction));
        }
        else
        {
              button.Text = "dede";
        }
    }
    Comment ça fonctionne ?
    - Premierement on regarde si on a besoin faire l'invoke. Si on en a pas besoin on fait le traitement directement
    - Si on as besoin du Invoke alors on y fait appel. La méthode Invoke demande en parametre un delégué pointant sur la méthode à éxécuter. Ici j'ai choisi de pointer sur la même méthode mais cela peut très bien être une autre méthode.

    Voila en gros

  6. #6
    Membre éclairé Avatar de llaffont
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2007
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2007
    Messages : 702
    Par défaut
    Merci,

    Bon ! C'est sur une très bonne voie.

    Mon dernier problème vient du Thread.

    Je pensais avoir compris qu'un job appelant un "thread Synchrone" se bloque jusqu'a la fin du thread et ensuite reprends sa route. Et que Thread Asynchrone travail en parralèlle du job appelant.

    Voilà mon 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
    private void button1_Click(object sender, EventArgs e)
            {
                Thread t1 = new Thread(new ThreadStart(traitement));
     
                if (this.button1.Text == "Lancer")
                {
                    desactive_Form();//je desactive les TextBox afin de montrer qu'un traitement est en cours.
                    this.button1.Text = "Annuler";
                    this.tb_Log.Clear();// je vide mon journal de log pour ne pas garder des informations d'une précendente intérrogation
                    t1.Start();// lancement du thread
                    active_Form();//Je réactive mes TextBox
     
                }
                else
                {
                    t1.Abort();//J'annule mon thread
                    active_Form();//Je réactive mes TextBox
                    this.button1.Text = "Lancer";
                    this.tb_Log.AppendText("Opération annulée\r\n"); //j'indique mon annulation
                    this.lbl_Name_fichier_result.Text = "Opération annulée";
                }
     
     
     
            }
     
     private void traitement()
            {
                Stopwatch Tps1 = new Stopwatch(); 
                Tps1.Start();
     
                string Path_SRV_DollarU = @"\\" + Ip_SRV + @"\" + Partage;
     
                Interrogation fichier_SRV = new Interrogation();
                fichier_SRV.Liaison_partage(Path_SRV_DollarU, Cpt_User, Cpt_Pass);//Ouverture du partage 
     
                string[] fichier_du_jour = fichier_SRV.Interrogation_Partage(Path_SRV_DollarU);// Interrogation du partage sur la présence du fichier Log
                if (fichier_du_jour != null)
                {
                    fichier_SRV.Copy_Fichier_Log(fichier_du_jour[0]);
                    this.Invoke(new change_lbl_Ok(change_lbl_result_Ok), fichier_du_jour);//lancement delegate afin d'afficher le resultat
                
                }
                else
                {
                    this.Invoke(new change_lbl_NOk(change_lbl_result_NOk));//lancement delegate afin d'afficher l'echec ou l'annulation
                }
     
                Tps1.Stop();
                string tps_fin = Tps1.Elapsed.Seconds.ToString();
                this.Invoke(new change_lbl_Time(fini), tps_fin);
     
            }

    Alors pourquoi mon thread devient Asynchrone dans mon cas ?
    Puisque les textbox passent de False à True lorsque lancer est cliqué

    Et question subsidiaire :

    Pourquoi mon t1.Abort() n'arrête t'il pas mon thread ???
    La dessus j'ai un début de réponse grace à un t1.suspend() qui me retourne "Le thread n'est pas en cours d'exécution ; il ne peut pas être suspendu."
    Alors ce que je coyais avoir compris s'avere etre faux...


  7. #7
    Rédacteur
    Avatar de dev01
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    2 451
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 2 451
    Par défaut
    Citation Envoyé par llaffont
    Alors pourquoi mon thread devient Asynchrone dans mon cas ?
    Puisque les textbox passent de False à True lorsque lancer est cliqué
    Un thread est une exécution à coté des fonctions c'est normal que le reste de ta fonction soit exécuté

    Citation Envoyé par llaffont
    Et question subsidiaire :

    Pourquoi mon t1.Abort() n'arrête t'il pas mon thread ???
    La dessus j'ai un début de réponse grace à un t1.suspend() qui me retourne "Le thread n'est pas en cours d'exécution ; il ne peut pas être suspendu."
    Alors ce que je coyais avoir compris s'avere etre faux...

    Parce que tu recrée un thread à chaque fois que tu cliques sur ton bouton. Tu est donc entrain d'essayer d'annuler un thread que tu n'as pas lancé

  8. #8
    Membre éclairé Avatar de llaffont
    Homme Profil pro
    Administrateur systèmes et réseaux
    Inscrit en
    Juin 2007
    Messages
    702
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 47
    Localisation : France, Loire (Rhône Alpes)

    Informations professionnelles :
    Activité : Administrateur systèmes et réseaux
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Juin 2007
    Messages : 702
    Par défaut
    Ok mon thread fonctionne correctement Merci dev01.

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

Discussions similaires

  1. Réponses: 20
    Dernier message: 08/06/2006, 10h12
  2. Réponses: 6
    Dernier message: 13/04/2006, 15h54
  3. [Débutant] Mon premier programme: rien ne va...
    Par vincent0 dans le forum OpenGL
    Réponses: 10
    Dernier message: 02/08/2005, 13h59
  4. Le JPanel est trop reduit pour mon interface !
    Par LeNeutrino dans le forum JBuilder
    Réponses: 4
    Dernier message: 25/07/2005, 18h58
  5. quel langage choisir pour mon interface graphique
    Par mrom34 dans le forum Langages de programmation
    Réponses: 6
    Dernier message: 09/03/2004, 19h12

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