Problème de thread (encore) [Résolu]

Signaler
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
-
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
-
En fait, je dois charger des données dans un Listview, et ca peut prendre du temps.
Donc pendant le temps de chargement et d'affichage, j'affiche une form pour faire patienter l'utilsateur...


Voila comment je m'y prend :


try
{
Thread tWait = new Thread(new ThreadStart(PleaseWait));
tWait.IsBackground = true;
tWait.Start();
// Ici : Chargement des données à afficher depuis le fichier
// Ici : Remplissage du listView avec ses données
tWait.Abort();


... // Ici encore deux trois opérations
}
catch
{
// Affiche une messageBox d'erreur
}


// Affichage de la form qui fait patienter
private void PleaseWait()
{
this._frmWait = new frmWaiting(unString);
this._frmWait.ShowDialog();
}


// Voici le code que j'ai dans la form qui fait patienter
public frmWaiting(string s)
{
this.InitializeComponent(); if(s !null) label.Text s
}


// Dans le load de la form, je mets un timer en marche.
// A chaque ticks, je fais tourner une picture box dans 90°
// Dans la méthode Dispose je fais un timer.Dispose (si jamais...)
private void tmrRotateImage_Tick(object sender, System.EventArgs e)
{
this.pictureBox.Image.RotateFlip(RotateFlipType.Rotate90FlipNone);
this.pictureBox.Refresh();
}



Le problème : Parfois (environ 1 fois 10) j'ai le message d'erreur suivant qui se produit (une exception non gérée blabalba) System.Threading.ThreadAbortException: Thread was being aborted.


Alors si quelqu'un à une idée du problème, c'est volentier que je prends la solution!
Merci.

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
A voir également:

9 réponses

Messages postés
48
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
1 septembre 2006
1
Je suis pas sûr d'avoir été encore une fois très explicite

Donc tu met un booleen à false avant de lancer ton thread

tu le met à true des que tu as finit ton traitement

et dans la fonction qui est lancé à partir de ton timer (tmrRotateImage_Tick) tu test ce booleen

et tu fait un close si il est à true

Fait juste attention que ce booleen soit accessible de partout
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
55
Merci de ta réponse.
En fait, j'ai trouvé la source d'erreur, ca vennait apparement du fait que parfois je killais mon thread (en faisant abort) alors même que ma form (qui est sensé faire patienter) n'était pas initialisée... Du coup elle avait pas de Handle, ce qui semblait poser problème.
Si je fais un test sur IsHandleCreated (property de ma form) alors j'ai plus de problème....

Ceci dit, je suis certain que ta solution fonctionne aussi, alors je la valide.
Merci de ton aide.

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
55
Allez ne soyez pas timide lol

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
Messages postés
48
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
1 septembre 2006
1
Salut,

c normal, tu fait "tWait.Abort();" qui dans son comportement normal
lève une exception de type System.Threading.ThreadAbortException qu'il
faut que tu catch pour arrêter le thread.



Mais je préfère quand même me mettre un booleen que je met à jour quand j'ai finit mon traitement.

Et dans la boucle qui gère ton image tu test ce booleen et tu ferme la form si necessaire
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
55
Euh, l'Exception System.Threading.ThreadAbortException est levée dans le nouveau thread qui est démarré, c'est à dire ici ma méthode PleaseWait() (il faudra que je pense à la renommer celle la ).
Je ne vois pas comment corriger mon probleme ?

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
Messages postés
48
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
1 septembre 2006
1
J'ai pas été assez explicite, quand tu fais "tWait.Abort();" ça veux
dire lève une exeption System.Threading.ThreadAbortException dans le
thread "tWait"
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
55
Merci, tu viens de répéter ce que j'ai écris dans le message juste dessus....

La question c'est comment résoudre ce problème? Car j'ai effectivement (environ 1 fois sur 10) un message qui s'ouvre et qui me dit qu'une Exception non gérer (....) s'est produite.
Un bloc try catch dans la méthode PleaseWait ne change pas le problème !

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
Messages postés
48
Date d'inscription
lundi 17 novembre 2003
Statut
Membre
Dernière intervention
1 septembre 2006
1
Oui pardon, j'avais mal lu.

Par contre comme je te l'ai dit dans ma 1ère intervention, je n'aime pas trop faire un abort sur un thread.

Essaye de faire terminer normalement ton thread cad de détruire ta form d'attente dès que ta listview est finit de chargée
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Modérateur
Dernière intervention
20 juin 2013
55
En faisant un frmWait.Close() donc ?
J'essayerai ça ce soir, je te donne des nouvelles demain, mais si mes souvenirs sont bons, j'avais déjà essayé ce système et ça n'avait pas marché.

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever