Pb de thread et freeze du programme

Résolu
greg76301 Messages postés 14 Date d'inscription mardi 19 juillet 2005 Statut Membre Dernière intervention 15 avril 2006 - 24 févr. 2006 à 11:22
greg76301 Messages postés 14 Date d'inscription mardi 19 juillet 2005 Statut Membre Dernière intervention 15 avril 2006 - 6 mars 2006 à 11:36
bonjour ,

je developpe un media player et lors du chargement de la playlist j'ai
souahité utiliser un thread car selon la taille de la playlist le
programme se fige au chargementde la playlist.

Le probleme c'est que meme avc un thread le programme ne repon tjs pas lors du chargement de la playlist.



Je recupere FileNames de l'openfiledialog et lance mon thread qui
charge une datagridview avc les noms de fichier, les durée, le chemin...



....


if (OpenFileDialog.ShowDialog() == DialogResult.OK)


{


list_fic = OpenFileDialog.FileNames;



thread_load = new Thread( new ThreadStart(load_playlist));


thread_load.Start();


//thread_load.Join();



current_media = (string)Playlist_grid.Rows[0].Cells[3].Value;


play_media();


}


}


private void load_playlist()


{


Playlist_grid.Rows.Clear();


int i = 0;


int nb_fic = list_fic.Length;


foreach (string file in list_fic)


{



Playlist_grid.Rows.Add(i, Path.GetFileName(file), toTime(new
Audio(file).Duration), file);



progbar_load_playlist.Value = (i / nb_fic) * 100;


i++;


}


}


la progress bar navance pas , et le reste des composant saffiche mal et ne sont pas cliquable.

Merci de votre aide =)

3 réponses

MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
24 févr. 2006 à 11:34
Salut,

Sans aller jusque dire que le probleme vient de la, tu as deja un souci de cross-threading.
Car tu modifies des propriétés d'objets qu'un thread a créé, depuis un autre thread. Et ca, c'est pas safe. (a savoir dans ton cas, ta progressbar et ton datagridview)

Pour resoudre ce probleme, il te faut utiliser des appels asynchrones. Je t'invite a lire ce tutorial (a force on va croire que je fais de la pub ) et aussi cet article sur la msdn.

Autrement, tu devrais mettre la propriété IsBackground de ton Thread a true;
Et finalement, pourquoi utiliser un foreach dans lequel tu incrementes un int a chaque fichier. Autant utiliser une boucle for a ce moment la ;)


Mx
MVP C#
3
greg76301 Messages postés 14 Date d'inscription mardi 19 juillet 2005 Statut Membre Dernière intervention 15 avril 2006
24 févr. 2006 à 18:11
merci de ta reponse

Je ne pense pas non plus que le souci vienne du cross-threading ms ds
un souci de propreté jv modifier mon code en suivant ton tutorial.
J'avais utilisé jusqu'a l'heure :
Control.CheckForIllegalCrossThreadCalls = false;



g essayer de mettre IsBackground a true sans succes ..

quand a la boucle j'ai modifié et ca venait de la :-s

un grand merci une fois de plus a Csharp.fr !
0
greg76301 Messages postés 14 Date d'inscription mardi 19 juillet 2005 Statut Membre Dernière intervention 15 avril 2006
6 mars 2006 à 11:36
En fait visiblement le probleme ne viens pas de là, j'ai supprimé le
thread pour tester et meme la petite form que g crée
composé d une progressbar et de 3 label ne s'affiche pas correctement.
il faut attendre la fin du traitement de la playlist pour afficher
correctement cette derniere, c 'est donc ridicule etant donnée que
c'est cette form qui donne l'etat d'avancement de la playlist.
Quelqu'un saurait-il comment est programmer de maniere a ce que le
rafraichissement de laffichage du programme se fasse correctement.

Dans le Windows media player , lorsque l 'on recherche des
fichier ds le pc pour les ajouter a la bibliotheque une fenetre avc une
barre de progression s'affiche avec des données de l'avancement de la
recherche sans que cela s'affiche mal. Quelqu'un saurait il comment
c'est fait?

Merci d'avance.

Je vous joins une image illustrant le bug daffichage de ma form:
0