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#

  1. #1
    Membre à l'essai
    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
    Points : 17
    Points
    17
    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 sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 153
    Points : 25 071
    Points
    25 071
    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 à l'essai
    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
    Points : 17
    Points
    17
    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 sénior Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 153
    Points : 25 071
    Points
    25 071
    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 éminent sénior

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

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 695
    Points
    10 695
    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.
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  6. #6
    Membre à l'essai
    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
    Points : 17
    Points
    17
    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.

  7. #7
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 695
    Points
    10 695
    Billets dans le blog
    21
    Par défaut
    Voici un petit exemple complet autosuffisant. Il s'agit d'une application winform :
    Code C# : 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
    using System;
    using System.Collections.Generic;
    using System.ComponentModel;
    using System.Data;
    using System.Drawing;
    using System.Linq;
    using System.Text;
    using System.Threading;
    using System.Threading.Tasks;
    using System.Windows.Forms;
     
    namespace CancelThread
    {
    	public partial class Form1 : Form
    	{
    		private CancellationTokenSource _cancellationToken;
    		private System.Windows.Forms.Button button1;
    		private System.Windows.Forms.Button button2;
     
    		public Form1()
    		{
    			InitializeComponent();
    		}
     
    		private async void Button1_Click(object sender, EventArgs e)
    		{
    			_cancellationToken = new CancellationTokenSource();
     
    			try
    			{
    				await Task.Delay(5000, _cancellationToken.Token);
    				MessageBox.Show("Tâche terminée");
    			}
    			catch (TaskCanceledException ex)
    			{
    				MessageBox.Show("Tâche interrompue");
    			}
    		}
     
    		private void Button2_Click(object sender, EventArgs e)
    		{
    			_cancellationToken.Cancel();
    		}
     
    		/// <summary>
    		/// Variable nécessaire au concepteur.
    		/// </summary>
    		private System.ComponentModel.IContainer components = null;
     
    		/// <summary>
    		/// Nettoyage des ressources utilisées.
    		/// </summary>
    		/// <param name="disposing">true si les ressources managées doivent être supprimées*; sinon, false.</param>
    		protected override void Dispose(bool disposing)
    		{
    			if (disposing && (components != null))
    			{
    				components.Dispose();
    			}
    			base.Dispose(disposing);
    		}
     
    		#region Code généré par le Concepteur Windows Form
     
    		/// <summary>
    		/// Méthode requise pour la prise en charge du concepteur - ne modifiez pas
    		/// le contenu de cette méthode avec l'éditeur de code.
    		/// </summary>
    		private void InitializeComponent()
    		{
    			this.button1 = new System.Windows.Forms.Button();
    			this.button2 = new System.Windows.Forms.Button();
    			this.SuspendLayout();
    			// 
    			// button1
    			// 
    			this.button1.Location = new System.Drawing.Point(12, 12);
    			this.button1.Name = "button1";
    			this.button1.Size = new System.Drawing.Size(75, 23);
    			this.button1.TabIndex = 0;
    			this.button1.Text = "Start";
    			this.button1.UseVisualStyleBackColor = true;
    			this.button1.Click += new System.EventHandler(this.Button1_Click);
    			// 
    			// button2
    			// 
    			this.button2.Location = new System.Drawing.Point(103, 12);
    			this.button2.Name = "button2";
    			this.button2.Size = new System.Drawing.Size(75, 23);
    			this.button2.TabIndex = 1;
    			this.button2.Text = "Stop";
    			this.button2.UseVisualStyleBackColor = true;
    			this.button2.Click += new System.EventHandler(this.Button2_Click);
    			// 
    			// Form1
    			// 
    			this.AutoScaleDimensions = new System.Drawing.SizeF(6F, 13F);
    			this.AutoScaleMode = System.Windows.Forms.AutoScaleMode.Font;
    			this.AutoSize = true;
    			this.ClientSize = new System.Drawing.Size(189, 71);
    			this.Controls.Add(this.button2);
    			this.Controls.Add(this.button1);
    			this.Name = "Form1";
    			this.Text = "Form1";
    			this.ResumeLayout(false);
     
    		}
     
    		#endregion
     
     
    	}
    }
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  8. #8
    Membre à l'essai
    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
    Points : 17
    Points
    17
    Par défaut
    Bonjour François,

    Merci pour votre exemple, ça fait plaisir quelqu'un qui répond sans prendre un air supérieur comme la majeur partie des gens ici ^^.

    Tous d'abord votre code est très bien mais le :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    await Task.Delay(5000, _cancellationToken.Token);
    Je veux le placer dans mon Thread, et il ne le prend pas (il me met une erreur). Pis si j'ai bien compris, Task fait une "tache" pendant un certain temps ?

    Mais moi dans mon cas je veux patienté un certains temps puis faire mon code, et ceci a chaque passage dans ma boucle while.
    Je ne sais pas vraiment en fait si ma méthode peut-être améliorée (voir code ci-dessus : ThreadProc()) ou si Task peut-être utilisé mais avec une autre méthode.

    Merci d'avance pour le temps pris pour me répondre
    Bonne journée !

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 153
    Points : 25 071
    Points
    25 071
    Par défaut
    Citation Envoyé par Kévin78 Voir le message
    ça fait plaisir quelqu'un qui répond sans prendre un air supérieur comme la majeur partie des gens ici ^^.
    ouais c'est chiant ces gens hautains
    après techniquement une boucle et une comparaison de date ca me parait être dans les bases … donc ca serait plus que je te rabaisse plutôt que de m'élever …
    m'enfin faut s'attacher au fond plus qu'à la forme, ca permet de progresser quand même (j'ai fourni le code même si c'était en bougonnant)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  10. #10
    Membre à l'essai
    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
    Points : 17
    Points
    17
    Par défaut
    Le problème c'est que pour toi ta méthode est évidente alors que dans mon cas elle n'est pas
    du tous adaptée.

    Donc c'est normal que je me questionne sur ton code car je ne comprends pas ce que tu essayais de faire.

    Après si c'est pour te donner des airs en rabaissaient les gens c'est super mais quand on est soi-disant "expert imminent", on a un minimum de respect avec ceux qui débutent et ne comprenne pas.

    Merci pour le code quand même mais dans mon cas ça ne fonctionne pas ou "je ne sais pas utiliser le code mis à ma disposition".
    Est-ce que je dois remplacer la boucle principale de mon thread par ça ? Dans ce cas, j'ai déjà essayé mais cela chamboule tout (et bien sur ne fonctionne pas.)

    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:
    }
    Quelqu'un saurait qu'elle est la meilleure méthode pour arriver à mes fins ? (la plus simple )

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 153
    Points : 25 071
    Points
    25 071
    Par défaut
    je pense pas que c'est pour me donner des airs... pas spécialement d'utilité...
    mais y a des gens qui ne prennent pas le temps de chercher, tu leur donne le nom de la propriété qui leur faut et il ne vont même pas lire l'aide ils demandent du code
    donc je pense que c'est pour filtrer les gens qu'on est un peu taquin

    concernant mon code
    tu as dit que ca fonctionnait et maintenant tu dis que ca ne fonctionne pas ...
    la boucle ne sert qu'à attendre 30 secondes tout en pouvant vérifier un booléen toutes les 200ms sans attendre la fin des 30 secondes, après ton code c'est ton code, à toi de voir ce que tu dois faire dans le if
    (et à vu de nez il est un peu mal architecturé ... mais j'ai pas le temps de le lire plus que ca pour l'instant)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  12. #12
    Membre à l'essai
    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
    Points : 17
    Points
    17
    Par défaut
    Oui je comprends mais parfois les doc's des fonctions ou propriétés ne sont pas très clairs pour quelqu'un qui débute, c'est pour ça qu'une bonne personne qui leur explique en direct est toujours mieux. Enfin bref passons à autre chose ^^.

    Oui j'ai dit que ça fonctionnait car ça me soûlait et je ne voulais plus chercher là-dessus, je voulais passer à autre chose.

    Je comprends ton raisonnement mais le problème c'est que si la personne sélectionne 1 minute, ou 3 ou 10, est-ce que cela ne va pas perturber le fonctionnement ? (Oui je sais mon code est pas optimisé etc. mais comme je le répète je débute vraiment, soyez indulgent.).

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 153
    Points : 25 071
    Points
    25 071
    Par défaut
    dans le code que je t'ai donné j'ai mis < step
    donc ca va attendre step secondes, donc si tu mets 60 ca attendra 60 secondes
    tu n'aurais pas compris mon code ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    var start = DateTime.Now; // on enregistre la date au moment de l'exécuiton de cette ligne
    while ((DateTime.Now - start).TotalSeconds < step) // tant que le nombre de secondes entre start et maintenant est inférieur à step on boucle
    {
        System.Threading.Thread.Sleep(200); // on attend 200 milliseconde, c'est pour soulager le processeur, une boucle sans sleep ca prend 100% de processeur, à 5ms c'est déjà bien, 200 me semble suffisant pour gérer une annulation
        if (le booléen dit qu''il faut arrêter) arrêter: // ici tu peux tester si doit annuler, auquel cas tu annule
    }
    ta question de base était comment arrêter un thread pendant qu'il est en thread.sleep(30 secondes)
    et on ne peut pas (enfin pas de manière propre, le sleep est bloquant)
    donc il faut trouver un moyen de tester plus souvent la condition de sortie tout en attendant 30 secondes quand même, d'où la boucle d'attente totale et le test dans la boucle pour savoir s'il faut sortir

    après ton code est pas lisible surtout parce que t'as une variable qui s'appelle threadstart
    si tu veux savoir si le thread est en cours tu appelles ta variable ThreadIsRunning et si c'est un flag d'annulation tu l'appelles NeedCancelThread (et la logique est inversée)
    donc je n'arrive pas à voir à quoi sert ce booléen vu son nom ...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  14. #14
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 695
    Points
    10 695
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par Kévin78 Voir le message
    Tous d'abord votre code est très bien mais le : await Task.Delay(5000, _cancellationToken.Token);
    Je veux le placer dans mon Thread, et il ne le prend pas (il me met une erreur).
    Très certainement à cause du await. async/await est une construction pratique permettant de rendre asynchrone un code séquentiel, sans beaucoup d'effort (et en gardant l'aspect séquentiel). Mais pour l'instant, c'est peut être un peu tôt pour aborder le sujet


    Citation Envoyé par Kévin78 Voir le message
    Pis si j'ai bien compris, Task fait une "tache" pendant un certain temps ?
    Oui. Task est une tâche. Task.Delay(x) retourne une tâche qui va durer x millisecondes. Faire un await dessus permet d'attendre la fin de la tâche (et donc ici, d'attendre x millisecondes)

    Citation Envoyé par Kévin78 Voir le message
    Mais moi dans mon cas je veux patienté un certains temps puis faire mon code, et ceci a chaque passage dans ma boucle while.
    Je ne sais pas vraiment enfaite si ma méthode peut-être améliorer (voir code ci-dessus : ThreadProc() ) ou si Task peut-être utilisé mais avec une autre méthode.
    J'avoue, je n'ai regardé que très rapidement et en diagonale le code de la méthode ThreadProc. J'ai préféré répondre à la question posée en français (comment interrompre une attente), que d'essayer d'interpréter le code (qui, en tant que débutant, n'est pas forcément le reflet de ce que tu souhaites).
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

  15. #15
    Membre à l'essai
    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
    Points : 17
    Points
    17
    Par défaut
    Donc si je comprend bien je ne suis pas encore prêt pour corrigé la petite erreur du Thread.Sleep ?

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 153
    Points : 25 071
    Points
    25 071
    Par défaut
    Avec sa méthode non, avec la mienne c'est jouable.
    Mais bon faudrait reposter ton code en ayant renommé le flag
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  17. #17
    Membre à l'essai
    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
    Points : 17
    Points
    17
    Par défaut
    Bonjour;

    Bon je vais me pencher sur ta méthode et essayer de la travailler de mon coté car sinon on risque de tourner en rond à force, je pense qu'il faut que je comprenne l'application de ton code avant d'aller plus loin.

    Merci tous de même.

  18. #18
    Membre à l'essai
    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
    Points : 17
    Points
    17
    Par défaut
    Bon finalement cela fonctionne parfaitement.

    Désolé Pol d'avoir remis en question tes capacités, c'est juste moi qui ne connais VRAIMENT pas bien C# ^^ (je débuuutee )

    La méthode est très bien, j'ai rajouté mon booléen dans ton while (... step && threadstart == true) du coup ça fonctionne niquel !

    Merci à tous pour avoir essayé d'aider un pauvre débutant borné ^^.
    Bonne journée à vous !

    EDIT : Petit problème ta méthode fonctionne très bien (pour arrêter ^^) mais il ne fait pas ma boucle pendant 1min, cela a pour conséquence de me mettre une erreur (que j'ai moi même défini). Il y aurait un moyen de faire en sorte que cela fasse pile 1 min (ou pas mais a peu près). Enfin quand je dit pile 1 min, idem pour 2,3,4 .. 120 min.

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 153
    Points : 25 071
    Points
    25 071
    Par défaut
    While ça boucle tant que la condition est vraie, il faut mettre une minute en condition...
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  20. #20
    Expert éminent sénior

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

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

    Informations forums :
    Inscription : Juillet 2016
    Messages : 2 757
    Points : 10 695
    Points
    10 695
    Billets dans le blog
    21
    Par défaut
    Citation Envoyé par Kévin78 Voir le message
    Donc si je comprend bien je ne suis pas encore prêt pour corrigé la petite erreur du Thread.Sleep ?
    Cela sera effectivement plus simple avec la méthode proposée par Pol63
    François DORIN
    Consultant informatique : conception, modélisation, développement (C#/.Net et SQL Server)
    Site internet | Profils Viadéo & LinkedIn
    ---------
    Page de cours : fdorin.developpez.com
    ---------
    N'oubliez pas de consulter la FAQ C# ainsi que les cours et tutoriels

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