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 :

Arrêter un thread ?


Sujet :

Windows Forms

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2003
    Messages : 33
    Par défaut Arrêter un thread ?
    Bonjour tout le monde,

    J'ai un problème avec un thread... J'ai déjà lu plusieurs discussions sur le sujet et lu la doc msdn, sans vraiment trouver/comprendre la solution !

    Mon problème :
    Je crée un thread :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    public void Run()
    {
    th = new Thread(new ThreadStart(RunThread));
    th.Start();
    }
    Et là, le thread fait son boulot... (des calculs...)

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    private void RunThread()
    {
    //des calculs... bcp de job est effectué sur le serveur 
    ....
    }
    L'utilisateur peut lancer plusieurs calculs simultanément, ce qui a pour résultat d'ouvrir chaque fois une Form qui affiche l'état d'avancement de mon calcul (a l'aide d'une progressbar) avec un simple bouton "Annuler" qui permet comme son nom l'indique d'annuler l'opération. Voici le code que j'ai pour l'instant sur mon bouton annuler :
    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
     
    //Thread can not be aborted during the insertion of results
    private void Button_Click(object sender, System.EventArgs e)
    {
    //si mon thread est terminé, je quitte l'appli
    if(cs.State==ThreadState.Aborted || cs.State== ThreadState.Stopped)
      {
      this.Close();
      Application.Exit();				
      }
    else if(cs.InsertIsDone == true)
    { 
     if (cs.State==ThreadState.Running || cs.State==ThreadState.WaitSleepJoin)
       {
        cs.Abort();
        this.Button.Text = "Fermer";
        }
     else
         {
         this.Close();
         Application.Exit(); 
         }
      }
    else
     {
     MessageBox.Show("Calculation can not be cancelled during writing of results");
     }
    }
    EN BREF : Mon thread n'atteint jamais l'état "Aborted" après avoir été annulé et ne se termine donc jamais.
    Une fois la méthode Abort() appelée, son état passe à "AbortRequested" et voilà..... Ensuite, je peux bien fermer ma Form, mais si regarde dans le gestionnaire des tâches de Windows, le process est toujours actif et je ne sais pas comment m'en débarrasser !

    J'espère avoit été assez clair ?
    Merci d'aavnce, j'ai besoin de vous !

  2. #2
    SLE
    SLE est déconnecté
    Membre émérite Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604
    Par défaut
    Peux-tu montrer ta procédure RunThread() ?
    T'aurais pas un lock ou autre qui cause le problème ?

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2003
    Messages : 33
    Par défaut
    Voila le code de RunThread, mais je pense pas que ça va t'aider... Il se passe plein de choses dans ce thread! Mais je n'utilise aucun lock.
    Je ne touve vraiment pas comment stopper ce thread!! Peut-être dois-je aller 'killer' le process... ?
    Lorsque je fais mon Application.Exit(), ça ne devrait pas supprimer les threads liés à cette application... ?

    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
    private void RunThread()
    		{
    			DateTime lastTime = System.DateTime.Now;
    			try
    			{
    				myTimerTotal = new System.Timers.Timer(1000);
    				myTimerTotal.Elapsed += new ElapsedEventHandler(OnTotalTimedEvent);
    				myTimerTotal.Enabled = true;
    				myTimerTotal.Start();
     
    				myTimer = new System.Timers.Timer(100);
    				myTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);
    				myTimer.Enabled = true;
    				myTimer.Start();
    				Trace.WriteLine(" Start: " + lastTime.TimeOfDay);
     
    				step = 1;
    				triggerShowProgress(0, 5, "Etape 1 sur 5");
    				triggerShowDetailProgress(0, 0, "Checking Rules...");
     
    				// Get calc infos
    				//Presta3.Calculation.Data._2_PrepareData.DataPrepare.GetCalculationInfos(ref param);				
    				//param.CalcErrors = Presta3.Calculation.Data._2_PrepareData.DataPrepare.GetErrorMessages(param);
     
    				// 1 Check Rules
    				if (!CheckRules())
    				{
    					this.hasErrors = true;
    					this.param.CalcStatus = CalcStatus.OnError;
    					throw new ArgumentException("Checking Rules Failed!");
    				}
    				triggerShowProgress(1, 5, "Etape 1 sur 5 terminée.");
    				this.triggerStepEnd(step, this.hasErrors, this.param);
     
    				// 2 PrepareObjects on DB
    				step = 2;
    				myTimer.Stop();
    				this.timeCount=0;
    				triggerShowProgress(1, 5, "Etape 2 sur 5");
    				triggerShowDetailProgress(0, 0, "Préparation des données...");
    				myTimer.Start();
    				DataPrepare dp = new DataPrepare(param);
    				triggerShowProgress(2, 5, "Etape 2 sur 5 terminée");
    				this.triggerStepEnd(step, this.hasErrors, this.param);
     
    				// 3 Get Structure
    				step = 3;
    				myTimer.Stop();
    				this.timeCount=0;
    				triggerShowProgress(2, 5, "Etape 3 sur 5");
    				triggerShowDetailProgress(0, 0, "Préparation de la structure...");
    				myTimer.Start();
    				DataStructure ds = new DataStructure(param);
    				tot = ds.GetStructure();
     
    				counter = (tot.CountChildrens * 2);
     
    				param.StudentValues = ds.GetStudentValues();
    				triggerShowProgress(3, 5, "Etape 3 sur 5 terminée");
    				this.triggerStepEnd(step, this.hasErrors, this.param);
     
    				// 4 Get Prices and Calculate
    				step = 4;
    				myTimer.Stop();
    				triggerShowProgress(3, 5, "Etape 4 sur 5");
    				triggerShowDetailProgress(0, 0, "Calculation...");
    				myTimer.Start();
    				results = DoCalculation(tot);
    				triggerShowProgress(4, 5, "Etape 4 of 5 terminée");
    				this.triggerStepEnd(step, this.hasErrors, this.param);
     
    				// 5 Save Result on DB
    				step = 5;
    				myTimer.Stop();
    				this.timeCount=0;
    				triggerShowProgress(4, 5, "Etape 5 sur 5");
    				triggerShowDetailProgress(0, 0, "Ecriture des résultats...");
    				myTimer.Start();
    				WriteResults(results);
    				DataResultReplication.WriteCalcStatus(param, param.CalcStatus , param.ToleranceLimitViolation );
    				myTimer.Stop();				
    			}
     
    			catch (Exception ex)
    			{
    				// Write error in log file with default error number
    				myTimer.Stop();
    				this.hasErrors = true;
    				this.triggerStepEnd(step, this.hasErrors, this.param);
    				param.LogFiles.WriteExceptionToErrorLogFile(ex);				
    				DataResultReplication.WriteCalcStatus(param, CalcStatus.OnError,param.ToleranceLimitViolation );				
    			}
     
    			finally
    			{
    				DataResultReplication drr = new DataResultReplication(param);
    				param.LogFiles.CloseFiles();
    				drr.WriteLogFileOnOracle();
    				drr.WriteErrorLogFileOnOracle();
     
    				if (this.hasErrors)
    				{
    					triggerShowProgress(step, 5, "Erreur - Calculation annulée !");
    					triggerShowDetailProgress(0, 5, "Erreur -  Calculation annulée !");
    				}
    				else
    				{
    					triggerShowDetailProgress(5, 5, "Ecriture des résultats terminée !");
    					triggerShowProgress(5, 5, "Etape 5 sur 5 terminée - Calculation terminée !");
    				}
    				this.triggerStepEnd(step, this.hasErrors, this.param);
    				this.triggerStepEnd(6, this.hasErrors, this.param);
    				myTimerTotal.Stop();							
    			}
    		}

  4. #4
    SLE
    SLE est déconnecté
    Membre émérite Avatar de SLE
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Janvier 2004
    Messages
    604
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Janvier 2004
    Messages : 604

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Février 2003
    Messages
    33
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Février 2003
    Messages : 33
    Par défaut
    Merci SLE,

    Comme dit dans mon premier post, j'ai déjà plus ou moins bien lu la doc msdn, mais ça ne m'a pas vraiment aidé...
    Voilà ce que raconte cet article http://msdn2.microsoft.com/fr-fr/lib...on(VS.80).aspx :
    Lorsqu'un appel à la méthode Abort demande la destruction d'un thread, le Common Language Runtime lève ThreadAbortException. ThreadAbortException est une exception spéciale qui peut être interceptée, mais qui est levée à nouveau automatiquement à la fin du bloc catch. Lorsque cette exception est levée, le runtime exécute tous les blocs finally avant de mettre fin au thread. Puisque le thread peut réaliser un nombre illimité de calculs dans les blocs finally ou appeler Thread.ResetAbort pour annuler l'abandon, il n'y a aucune garantie qu'il prenne fin. Si vous souhaitez attendre que le thread interrompu soit terminé, vous pouvez appeler la méthode Thread.Join. Join est un appel bloquant qui n'est pas retourné tant que l'exécution du thread n'est pas interrompue.
    En gros il explique comment annuler l'annulation d'un thread... et le reste de la doc dit bien que la méthode Abort "arrête généralement le thread"... et que la méthode Join nous fait patienter jusqu'à la mort du thread, mais don mon cas c'est infini....
    Il n'est pas garanti que le thread soit abandonné immédiatement ou même plus tard. Cette situation peut se produire si un thread effectue un nombre illimité de calculs dans les blocs finally appelés dans le cadre de la procédure d'abandon, ce qui retarde indéfiniment l'abandon. Pour attendre qu'un thread soit abandonné, vous pouvez appeler la méthode Join sur le thread après avoir appelé la méthode Abort, mais rien ne garantit que l'attente prendra fin.
    Je ne sais pas que faire... si qqn a une proposition pour me dire comment terminer proprement un trhead (même si c'est radical) , je suis preneur !

Discussions similaires

  1. Arrêter un thread en python ?
    Par fanou31 dans le forum Général Python
    Réponses: 7
    Dernier message: 23/06/2013, 18h15
  2. Réponses: 2
    Dernier message: 05/10/2006, 17h56
  3. [Thread] arrêter un thread
    Par melvar dans le forum Concurrence et multi-thread
    Réponses: 4
    Dernier message: 10/04/2006, 18h06
  4. Réponses: 18
    Dernier message: 06/04/2005, 14h09
  5. Arrêter une Thread brutalement!
    Par Rodrigue dans le forum C++Builder
    Réponses: 2
    Dernier message: 18/01/2004, 21h29

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