Threads

Moomoon07 Messages postés 223 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 5 mai 2014 - 24 août 2006 à 17:34
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 - 26 août 2006 à 14:32
salut !

Je suis toujours en galère avec les threads !
Voici un morceau de mon code.
J'aimerais pouvoir executer "génération" dans un thread.
Je n'arrive pas à glisser le paramètre dans mon appel de fonction, ThreadPool.QueueUserWorkItem(newWaitCallback(Génération))
ne veut que le nom de la fonction en param.

private
void bGénérer_Click(
object sender,
EventArgs e)
{

string NomRep = DA.getNomCharte(getNumCharte()) +
" [" + DateProd.Day.ToString() +
"-" + DateProd.Month.ToString() +
"-" + DateProd.Year.ToString() +
"]";

DialogResult d =
MessageBox.Show(
"Un dossier contenant les playlists et les titres MP3 de la charte va être créé\nCe dossier s'appellera :\n" + CF.getCheminPlaylists() + NomRep +
"\n(Les doublons seront écrasés)\nVoulez vous continuer ?",
"Génération de la charte",
MessageBoxButtons.YesNo);

if (d ==
DialogResult.Yes)
      
ThreadPool.QueueUserWorkItem(
new
WaitCallback(Génération));
}

private
void Génération(
string NomRep,
object state)
{
i
f (!
Directory.Exists(CF.getCheminPlaylists() + NomRep))
{

Directory.CreateDirectory(CF.getCheminPlaylists() + NomRep);

StreamWriter Rapport =
new
StreamWriter(CF.getCheminPlaylists() + NomRep +
"/Rapport.txt",
false,
ASCIIEncoding.Default);CreerPlaylists(CF.getCheminPlaylists() + NomRep, Rapport);

Rapport.Close();
}

else
MessageBox.Show(
"Ce dossier existe déja, la charte ne peut être générée");
}

J'ai essayé cette solution aussi :
Mais jai une erreur me disant que  DA.getNomCharte(getNumCharte()) n'a pas été déclaré dans le thread

private
void bGénérer_Click(
object sender,
EventArgs e)
{

ThreadPool.QueueUserWorkItem(
new
WaitCallback(Génération));
}

private
void Génération(
string NomRep,
object state)
{
s
tring NomRep = DA.getNomCharte(getNumCharte()) +
" [" + DateProd.Day.ToString() +
"-" + DateProd.Month.ToString() +
"-" + DateProd.Year.ToString() +
"]";

DialogResult d =
MessageBox.Show(
"Un dossier contenant les playlists et les titres MP3 de la charte va être créé\nCe dossier s'appellera :\n" + CF.getCheminPlaylists() + NomRep +
"\n(Les doublons seront écrasés)\nVoulez vous continuer ?",
"Génération de la charte",
MessageBoxButtons.YesNo);

if (d ==
DialogResult.Yes)

if (!
Directory.Exists(CF.getCheminPlaylists() + NomRep))
{

Directory.CreateDirectory(CF.getCheminPlaylists() + NomRep);

StreamWriter Rapport =
new
StreamWriter(CF.getCheminPlaylists() + NomRep +
"/Rapport.txt",
false,
ASCIIEncoding.Default);CreerPlaylists(CF.getCheminPlaylists() + NomRep, Rapport);

Rapport.Close();
}

else MessageBox.Show(
"Ce dossier existe déja, la charte ne peut être générée");
}

}
J'ai lu un truc sur le synchrone et l'asynchrone, mais jai rien compris. Est ce que vous pouriez me donner un petit exemple d'appel de foction avec paramètre par un thread ?

MMN

9 réponses

leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
24 août 2006 à 19:51
je ne connais pas l'objet threadpool, mais pourquoi ne pas utiliser un objet thread tout simplement? cela ne permet pas de passage de paramètres et il te faudra alors trouver une solution....celle que j'utilise généralement ressemble un peu a ca :

public class class1
{
public class classthread
{
public int arg1;
public string arg2;

public void MaMethodeThreadéeQuiABesoinDarguments()
{
}
}

public void MaMethodeQuiAppelleLeThread(int arg1, string arg2)
{
Thread MonThread = new Thread(new ThreadStart(MaMethodeThreadéeQuiABesoinDarguments));
classthread.Arg1 = arg1;
classthread.Arg2 = arg2;
MonThread.Start();
}
}

je sais pas si ce code fonctionne correctement (déjà) car j'ai ptetre fait qqs erreurs.
de plus, je sais pas si ca répond correctement a ton besoin (en tous cas j'espere)
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
24 août 2006 à 20:18
leprov> avec .NET 2, les threads supportent le passage d'arguments.

<hr size="2" />VC# forever
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
24 août 2006 à 20:20
Moomoon> Il est grand temps d'arrêter les concaténations multiples avec des + ...

<hr size="2" />VC# forever
0
leprov Messages postés 1160 Date d'inscription vendredi 23 juillet 2004 Statut Membre Dernière intervention 21 octobre 2010 17
24 août 2006 à 20:51
@bidou : ah ok je savais pas, merci pour l'info, je regarderais ca....je suis resté avec l'idée du framework 1.1 ou les arguments ne passaient pas ;)
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
25 août 2006 à 13:06
Pour les threads avec parametres en .net 1  et 2, tu peux voir ici

Mx
MVP C# 
0
Moomoon07 Messages postés 223 Date d'inscription mercredi 31 mai 2006 Statut Membre Dernière intervention 5 mai 2014
25 août 2006 à 17:36
OK ... merci pour votre aide, je vais regarder d'un peu plus prêt vos idées.


Bidou> Pourquoi me dis tu qu'il faut arréter les concaténations multiples avec des + ?
Ca bouffe de la ram ? Je ne comprends pas, moi je trouve ça très pratique.

MMN
0
MorpionMx Messages postés 3466 Date d'inscription lundi 16 octobre 2000 Statut Membre Dernière intervention 30 octobre 2008 57
25 août 2006 à 20:24
Salut,
Une string etant immutable, chaque concatenation implique l'instanciation d'une nouvelle string -> procédure très lourde, surtout pour de grosses boucles.
Il vaut bien mieux utiliser la classe StringBuilder et sa méthode Append.

Mx
MVP C# 
0
cs_Bidou Messages postés 5487 Date d'inscription dimanche 4 août 2002 Statut Membre Dernière intervention 20 juin 2013 61
25 août 2006 à 21:27
Oui, ou au moins faire un string.Format()

<hr size="2" />VC# forever
0
cs_coq Messages postés 6349 Date d'inscription samedi 1 juin 2002 Statut Membre Dernière intervention 2 août 2014 101
26 août 2006 à 14:32
Salut,

Et pour les chemins il vaut mieux passer par Path.Combine.

/*
coq
MVP Visual C#
CoqBlog
*/
0
Rejoignez-nous