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 :

Comment arrêter un Thread directement pendant qu'il est en Thread.Sleep de 30 secondes.


Sujet :

C#

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 28
    Par défaut Comment arrêter un Thread directement pendant qu'il est en Thread.Sleep de 30 secondes.
    Bonjour à tous (j'espère que mon titre est clair),

    J'alimente une progressbar de 1% par step (variable contenant un calcul en fonction du temps choisis par un utilisateur).

    Donc si l'utilisateur choisis 1 min, step = 60 / 100. Quand j'arrête ce thread avec un booléen de type threadstart == false le Thread s'arrête car a chaque boucle il vérifie si threadstart == true, il s'arrête plutôt rapidement (0,6 seconde environ). Hors j'ai rallongé le temps en permettant à un utilisateur de sélectionner 60 min et 120 min, le temps d'arrêt est passé de 0,6 secondes a 36 secondes.

    C'est super long surtout qu'un message confirmant que l'application s'est bien arrêter ne s'affiche donc que 36 secondes après et le double si l'on met 120 min.

    Auriez vous une solution pour palier à mon problème ?
    Merci d'avance a tous.
    Bonne journée.

  2. #2
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    remplacer le thread.sleep(30000) par une boucle de 30 secondes avec un thread.sleep(200) + vérification du booléen
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 28
    Par défaut
    Bonjour,

    Je n'est pas bien compris votre méthode, je remplace le Thread.Sleep(30000) par une boucle de 30 sec, mais comment je fais ça ?
    Je vous montre l'intégralité du code de mon Thread :


    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
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    196
    197
    198
    199
    200
    201
    202
    203
    204
    205
    206
    207
    208
    209
    210
    211
    212
    213
    214
    215
    216
    217
    218
    219
    220
    221
    222
    223
    224
    225
    226
    public void ThreadProc()
            {
                try
                {
                    // donne le temps saisis ainsi que le mail dans une variable !! attention !! guillemet important pour fonctionnement.
                    string Info = " " + temps.Text + " " + text_mail.Text + " ";
                    // Execute le script shell en y ajoutant les arguments en variable.
                    var ps1File = @"C:\Temp\2.ps1";
                    var startInfo = new ProcessStartInfo(@"path\to\Powershell.exe", @"""2.ps1""")
                    {
                        FileName = "powershell.exe",
                        Arguments = $"-NoProfile -ExecutionPolicy unrestricted -file \"{ps1File}\"{Info}\"",
                        UseShellExecute = true
                    };
                    // Execute le script grace a la commande Process puis lance le contenu de startInfo.
                    Process.Start(startInfo);
                    // Conversion des minutes saisi en seconde.
                    int Convert = int.Parse(temps.Text);
                    double TSeconde = Convert * 60;
     
                    // défini le nombre de pas de la progressbar en fonction du temps et de la maximum de la progressbar.
                    double step = TSeconde / 100;
     
                    // Initialisation de la progressbar du maximum à 100.
                    progress_bar.Maximum = 100;
                    // Initialisation de la valeur de la progressbar à 0.
                    progress_bar.Value = 0;
     
                    // crée une collection "counter".
                    var counter = new List<int>();
                    //initialise i à 1.
                    int i = 1;
                    //initialise ok à vrai.
                    bool ok = true;
                    // Crée une variable pour compter le nombre de ligne et l'initialise a 0.
                    counter.Add(0);
                    // Renvoie au format boolean l'état de la connexion (true or false) si on a internet = true, sinon false
                    int Desc;
                    bool Connexion = InternetGetConnectedState(out Desc, 0);
                    int nbLignes = 0;
                    threadstart = true;
     
                    while (i < 100 && ok && threadstart == true && Connexion == true)
                    {
                        if (threadstart == true)
                        {
                            notificationIcon = true;
                            // l'execution ce met en pause pendant le nombre contenu dans la variable step en seconde fois 1000 (1 seconde) (exemple : 0.6 * 1 = step = 0,6).
                            Thread.Sleep((int)(step * 1000));
                            // Compte le nombre de ligne du fichier de log et les rajoute a la variable nbLignes.
                            // int nbLignes = File.ReadLines(@"c:\ju\temp.log").Count();
                            using (FileStream fs = new FileStream(@"C:\ju\temp.log", FileMode.Open, FileAccess.Read, FileShare.ReadWrite))
                            {
                                using (StreamReader sr = new StreamReader(fs))
                                {
                                    // Lit tout le contenue du fichier (ReadToEnd) 
                                    // Divise en autant d’élément (+1) qu'il y a de retour ligne (Split(new char[] { '\n' }))
                                    nbLignes = sr.ReadToEnd().Split(new char[] { '\n' }).Count();
                                }
                            }
                            // ajoute a la collection counter la variable nbLignes
                            counter.Add(nbLignes);
                            // Si le temps entre chaque seconde est supérieur ou égal a 1.2.
                            if (step >= 1.5)
                            {
                                // Si le nombre de ligne est identique donc pas de nouvel ligne, arrête la progression.
                                if (counter[i] == counter[i - 1] || Connexion == false || threadstart == false)
                                {
                                    // Affiche la fenetre et la met a sa taille normal si elle a été réduit au préalable.
                                    this.Show();
                                    this.WindowState = FormWindowState.Normal;
                                    // la variable ok devient fausse.
                                    ok = !ok;
                                    // la bar de progression revient a 0.
                                    progress_bar.Value = 0;
                                }
                                // sinon continue la progression
                                else
                                {
                                    // la progressbar gagne la valeur de i (while i < 100) i++.
                                    progress_bar.Value = i;
                                    lab_pourcent.Text = i + "%";
                                    notifyIcon1.Text = "Cogiping - " + i + "%";
                                    i++;
                                }
                            }
                            // Sinon on execute le programme une fois sur 2 a chaque passage dans la boucle.
                            else
                            {
                                if (i % 2 == 0)
                                {
                                    // Si le nombre de ligne est identique donc pas de nouvel ligne, arrête la progression.
                                    if (counter[i] == counter[i - 2])
                                    {
                                        // Affiche le form si il a été réduit au préalable ainsi que dans la barre de tache
                                        this.Show();
                                        this.WindowState = FormWindowState.Normal;
                                        // la variable ok devient fausse.
                                        ok = !ok;
                                        // la bar de progression revient a 0.
                                        progress_bar.Value = 0;
                                    }
                                    // Sinon on continue la progression
                                    else
                                    {
                                        // la progressbar gagne la valeur de i (while i < 100) i++.
                                        progress_bar.Value = i;
                                        lab_pourcent.Text = i + "%";
                                        notifyIcon1.Text = "Cogiping - " + i + "%";
                                        i++;
                                    }
                                }
                                // Sinon on continue la progression.
                                else
                                {
                                    // la progressbar gagne la valeur de i (while i < 100) i++.
                                    progress_bar.Value = i;
                                    lab_pourcent.Text = i + "%";
                                    notifyIcon1.Text = "Cogiping - " + i + "%";
                                    i++;
                                }
     
                            }
                            // Si la progressbar atteind 99, elle passe automatiquement a 100 et si au préalable la fenetre était réduite une notification apparait ainsi que la fenetre .
                            // et l'icon dans la bar de tache.
                            if (progress_bar.Value == 99)
                            {
                                notifyIcon1.ShowBalloonTip(1000, "Cogiping", "Le test est presque terminé !", ToolTipIcon.Info);
                                this.Show();
                                this.WindowState = FormWindowState.Normal;
                                progress_bar.Value = 100;
                                lab_pourcent.Text = "100%";
                            }
                            // Si la progressbar est à 100.
                            if (progress_bar.Value == 100)
                            {
                                // On cache la progressbar et le text du pourcentage et le pourcentage
                                progress_bar.Hide();
                                lab_pourcent.Hide();
                                lab_pourtext.Hide();
                                // remplace la valeur de lab pourcent par 0
                                lab_pourcent.Text = "0%";
                                // On montre le message "Reussis".
                                lab_complete.Show();
                                // On affiche un message de reussite.
                                MessageBox.Show("L'analyse s'est bien effectuée, veuillez patienter pour la confirmation de l'envoi du mail.");
                                // On cache l'icon dans la barre de tache.
                                notifyIcon1.Visible = false;
                                // On initialise la valeur de la progressbar à 0.
                                progress_bar.Value = 0;
                                Thread.Sleep(4500);
                                // Si le threadstart == false donc si on arrête le thread avec le bouton annuler, on met la progressbar a 0 et le lab pourcent également.
                                if (threadstart == false)
                                {
                                    progress_bar.Value = 0;
                                    lab_pourcent.Text = "0%";
                                    notifyIcon1.Visible = false;
                                    // On remet la variable notificationIcon a false afin de ne pas afficher l'icon quand l'utilisateur réduit la.
                                    notificationIcon = false;
                                    // On affiche la progressbar et le text du pourcentage et le pourcentage
                                    lab_pourtext.Show();
                                    progress_bar.Show();
                                    lab_pourcent.Show();
                                    // On dévérouille l'option qui permettait de ne pas sélectionner des items.
                                    temps.Enabled = true;
                                    text_mail.Enabled = true;
                                    button1.Enabled = true;
                                    MessageBox.Show("Le mail à " + text_mail.Text + " ne s'est pas envoyé.\nVeuillez appuyer sur le bouton \"Play\" pour recommencer.");
                                }
                                else
                                {
                                    // On affiche un message de confirmation du mail.
                                    MessageBox.Show("Le mail à " + text_mail.Text + " s'est bien envoyé !");
                                    // On cache le message de reussite.
                                    lab_complete.Hide();
                                    // On affiche la progressbar et le text du pourcentage et le pourcentage
                                    lab_pourtext.Show();
                                    progress_bar.Show();
                                    lab_pourcent.Show();
                                    // On dévérouille l'option qui permettait de ne pas sélectionner des items.
                                    temps.Enabled = true;
                                    text_mail.Enabled = true;
                                    button1.Enabled = true;
                                }
                                // On remet la variable notificationIcon a false afin de ne pas afficher l'icon quand l'utilisateur réduit la.
                                notificationIcon = false;
                            }
                            // Si l'utilisateur n'a plus de connexion on affiche un message d'erreur
                            if (Connexion == false)
                            {
                                MessageBox.Show("CODE 1000\nUne erreur s'est produite dans l'analyse\nIl n'y a plus de connexion Internet, veuillez appuyer sur le bouton \"Annuler\" et vous reconnectez a Internet\nSi le problème persiste contactez Cogidis.");
                                notifyIcon1.Visible = false;
                                // Tue le process en cours en tache de fond (powershell).
                                Process[] processList = Process.GetProcessesByName("powershell");
                                foreach (Process p in processList)
                                {
                                    p.Kill();
                                }
                                notifyIcon1.Visible = false;
                            }
                            // Si l'utilisateur arrête le thread on affiche un message de confirmation
                            else if (threadstart == false)
                            {
                                MessageBox.Show("CODE 2000\nL'analyse s'est bien arrêtée\nPour recommencer appuyer sur le bouton \"Démarrer\".");
                                notifyIcon1.Visible = false;
                                Process[] processList = Process.GetProcessesByName("powershell");
                                foreach (Process p in processList)
                                {
                                    p.Kill();
                                }
                                notifyIcon1.Visible = false;
                            }
                            // Si le le ping ne s'actualise plus dans le fichier de log on affiche un message d'erreur 
                            else if (!ok)
                            {
                                MessageBox.Show("CODE 3000\nUne erreur s'est produite dans l'analyse\nLe test ne s'actualise plus, veuillez appuyer sur le bouton \"Annuler\" et recommencez.");
                                // Tue le process en cours en tache de fond (powershell).
                                Process[] processList = Process.GetProcessesByName("powershell");
                                foreach (Process p in processList)
                                {
                                    p.Kill();
                                }
                                notifyIcon1.Visible = false;
                            }
                        }
                    }
    Désolé pour les fautes d'orthographes dans les commentaires ou dans le code

  4. #4
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    une boucle c'est une boucle, et 30 secondes c'est 30 secondes
    non ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var start = DateTime.Now;
    while ((DateTime.Now - start).TotalSeconds < step)
    {
        System.Threading.Thread.Sleep(200);
        if (le booléen dit qu''il faut arrêter) arrêter:
    }
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  5. #5
    Expert confirmé

    Avatar de François DORIN
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2016
    Messages
    2 761
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Charente Maritime (Poitou Charente)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 761
    Billets dans le blog
    21
    Par défaut
    Ou sinon, il est possible d'utiliser un Task.Delay couplé à un CancellationToken pour éviter de faire une boucle pour l'attente. Et le temps de réaction sera immédiat.

  6. #6
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Mai 2019
    Messages
    28
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mai 2019
    Messages : 28
    Par défaut
    Bonjour,

    J'ai regarder un peu mais je n'est pas compris comment l'utilisé, pourriez-vous m'indiquez un exemple comment couplé les deux s'il vous plait ?

    Un problème que j'ai rencontrer est que le CancelationToken ne peut pas s'utilisé dans mon bouton annulé pour annulé la Task qui est dans mon Thread, enfin c'est comme cela que j'ai compris la méthode, je me trompe surement.

Discussions similaires

  1. Comment arrêter un Thread proprement
    Par takinelinfo dans le forum C#
    Réponses: 9
    Dernier message: 08/01/2018, 08h42
  2. Comment arrêter mon Thread ?
    Par avenger22 dans le forum Général Java
    Réponses: 10
    Dernier message: 06/04/2014, 10h27
  3. Comment arréter un thread qui exécute une instruction bloquante
    Par nibor2luxe dans le forum Concurrence et multi-thread
    Réponses: 15
    Dernier message: 28/02/2008, 17h03
  4. [java.util.Timer]Comment arrêter l'exécution d'un Thread
    Par Invité dans le forum Concurrence et multi-thread
    Réponses: 1
    Dernier message: 07/06/2006, 07h54
  5. Réponses: 18
    Dernier message: 06/04/2005, 14h09

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