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 :

[C#] "Le thread a ete abandonne"


Sujet :

Windows Forms

  1. #1
    Membre du Club

    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 44
    Points : 48
    Points
    48
    Par défaut [C#] "Le thread a ete abandonne"
    J'annule un thread en cours d'execution avec
    Et voici le message qui m'est retourné:

    Le thread a ete abandonne 'CALCUL_ALERTE 3,101'
    CALCUL_ALERTE est une procédure stockée.
    Ce qui veut dire que le thread a interrompu son execution. Donc je comprend le problème. Et je pense qu'il faut donc mettre un lock

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    lock(this)
    {
    Calculer_Mon_Alerte()
    }
    (Avec Calculer_Mon_Alerte() qui se charge de l'éxecution de ma procédure stockée)


    Cela ne résoud pas mon pb. Donc je me suis trompé. Mais où ?

  2. #2
    DrQ
    DrQ est déconnecté
    Membre expérimenté
    Avatar de DrQ
    Profil pro
    Inscrit en
    Mars 2002
    Messages
    388
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2002
    Messages : 388
    Points : 1 515
    Points
    1 515
    Par défaut
    Peux tu expliquer un peu plus l'architecture de ton prog ? Qu'est ce qui est lancé dans le thread ? Que souhaites tu arréter et laisser continuer ?
    1)http://www.developpez.com/cours/
    2)Recherche
    3)Posez votre question en suivant les règles
    _oOo-DrQ-oOo_

  3. #3
    Membre du Club

    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 44
    Points : 48
    Points
    48
    Par défaut
    Je dois effectuer un long calcul, ainsi, je l'ai mis dans un thread.

    J'appuie sur mon bouton "Calculer" : il me démarre mon thread.
    J'appuie sur "Annuler" : il me le stoppe. > monthread.Abort()



    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
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
     
    	public class F_Alertes : System.Windows.Forms.Form
    	{
    		private void  bCalcul_Click(object sender, System.EventArgs e)
    		{
    			ThreadCalcul threadCalc = new ThreadCalcul()
    			this._treadCalcul = new Thread(new ThreadStart(threadCalc.Calculer));
     
    			this._treadCalcul.Start();
     
     
    		}
    		private void bAnnuler_Click(object sender, System.EventArgs e)
    		{
     
    			this._treadCalcul.Abort();
     
    		}
     
    	}
     
     
    	public class ThreadCalcul
    	{
     
     
     
    		// Constructeur	
    		public  ThreadCalcul ()
    		{
     
    			//En fait ici j'ai l'initialisation de tous mes parametres, mais ceci fonctionne bien donc je passe sous silence.
    		}
     
    		public void Calculer()
    		{
     
    			//instructions sans importance
     
     
    			for(int i = 0 ; i < 100 ; i++)
    			{ 
    				lock(this)
    				{
     
    					Calculer_Alertes();
    				}
    			}
     
    			//instructions sans importance
     
    		}
     
    		private void							Calculer_Alertes()
    		{
     
    			string strSQL = "CALCUL_ALERTE ";
     
    			//data est une classe perso qui fonctionne très bien, le pb ne peux pas venir d'elle
    			data dat = new data(this.connect);
     
    			dat.Exec(strSQL);
     
     
     
     
    		}
     
    	}

    à quoi sert 'lock' exactement?
    L'ai-je utilisé dans un bon contexte?

  4. #4
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Salut,

    Le lock permet de synchroniser plusieurs thread pour qu'ils ne puissent pas éxécuter un bout de code en même temps (c'est un Mutex). Dans ton cas je pense que ça ne sert à rien vu qu'il n'y a qu'un seul thread de lancé.

    Par contre qque chose m'étonne : il n'y a aucune boucle dans ta fonction Calculer_Alertes, alors je suppose que le traitement long se fait coté serveur sql dans la procédure CALCUL_ALERTE ? Sans ça ton abort ne sert à rien vu que l'exécution de ton thread s'arrete dés le retour de la procédure stockée. Si c'est effectivement le cas et alors ton abort stoppe net l'exécution de la procédure stockée, ce qui est surement trés mauvais ...

  5. #5
    Membre du Club

    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 44
    Points : 48
    Points
    48
    Par défaut
    Très juste.
    En fait, il y a bien une boucle dans la procédure, mais je l'ai effacée pour rendre une meilleure lisibilité.

    Je vais, de ce pas, éditer mon message pour la rajouter. Merci



    Comment puis-je faire pour exiger de finir l'execution de ma procédure stockée avant d'annuler?

  6. #6
    Membre éprouvé
    Profil pro
    Inscrit en
    Août 2003
    Messages
    835
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Août 2003
    Messages : 835
    Points : 1 046
    Points
    1 046
    Par défaut
    Ah ok, dans ce cas c'est mieux. Ce qu'il faut faire dans ton thread c'est pas une boucle infinie mais une boucle avec une condition sur une variable, du genre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    While( ContinuerExcecution )
    {
        //Code du thread
    }
    Et dans ton thread principal, qd tu veux arreter ton thread tu fais :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ContinuerExcecution = false;
    Comme ça tu es sûr que le dernier appel à ta procédure stockée sera terminé, tu vois l'idée ? Un thread.Abort n'est pas une bonne chose de maniere générale, c'est trop brutal, tu ne controles pas ce qui se passe, et tu laisses les choses dans un état "inconnu", il faut l'utiliser en cas de dernier recours, comme par exemple N secondes aprés avoir positioné ta variable à false, si ton thread n'est toujours pas terminé, alors il y a un probleme (la procédure bloque) et là tu fais un thread.abort, mais c'est extreme.

  7. #7
    Membre du Club

    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    44
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 44
    Points : 48
    Points
    48
    Par défaut
    Ok merci du coup de main.

    Je commence tout juste les threads depuis aujourd'hui.
    C'est vraiment pratique ....

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

Discussions similaires

  1. System.Threading.Le thread a été abandonné.
    Par p1k1 dans le forum ASP.NET
    Réponses: 2
    Dernier message: 03/07/2007, 10h36

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