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

cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 31 mai 2005 à 08:53 - Dernière réponse : cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention
- 3 juin 2005 à 08:08
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
Afficher la suite 

Votre réponse

9 réponses

Meilleure réponse
tchoucky 48 Messages postés lundi 17 novembre 2003Date d'inscription 1 septembre 2006 Dernière intervention - 2 juin 2005 à 15:50
3
Merci
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

Merci tchoucky 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 75 internautes ce mois-ci

Commenter la réponse de tchoucky
Meilleure réponse
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 3 juin 2005 à 08:08
3
Merci
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

Merci cs_Bidou 3

Avec quelques mots c'est encore mieux Ajouter un commentaire

Codes Sources a aidé 75 internautes ce mois-ci

Commenter la réponse de cs_Bidou
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 31 mai 2005 à 18:18
0
Merci
Allez ne soyez pas timide lol

[Pub] http://www.csharpfr.com/auteurdetail.aspx?ID=13319 [\Pub]
C# forever
Commenter la réponse de cs_Bidou
tchoucky 48 Messages postés lundi 17 novembre 2003Date d'inscription 1 septembre 2006 Dernière intervention - 2 juin 2005 à 12:10
0
Merci
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
Commenter la réponse de tchoucky
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 2 juin 2005 à 12:15
0
Merci
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
Commenter la réponse de cs_Bidou
tchoucky 48 Messages postés lundi 17 novembre 2003Date d'inscription 1 septembre 2006 Dernière intervention - 2 juin 2005 à 12:19
0
Merci
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"
Commenter la réponse de tchoucky
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 2 juin 2005 à 14:58
0
Merci
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
Commenter la réponse de cs_Bidou
tchoucky 48 Messages postés lundi 17 novembre 2003Date d'inscription 1 septembre 2006 Dernière intervention - 2 juin 2005 à 15:06
0
Merci
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
Commenter la réponse de tchoucky
cs_Bidou 5507 Messages postés dimanche 4 août 2002Date d'inscription 20 juin 2013 Dernière intervention - 2 juin 2005 à 15:27
0
Merci
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
Commenter la réponse de cs_Bidou

Vous n'êtes pas encore membre ?

inscrivez-vous, c'est gratuit et ça prend moins d'une minute !

Les membres obtiennent plus de réponses que les utilisateurs anonymes.

Le fait d'être membre vous permet d'avoir un suivi détaillé de vos demandes et codes sources.

Le fait d'être membre vous permet d'avoir des options supplémentaires.