Threads

Signaler
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
5 mai 2014
-
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Membre
Dernière intervention
2 août 2014
-
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

Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
18
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)
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
leprov> avec .NET 2, les threads supportent le passage d'arguments.

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

<hr size="2" />VC# forever
Messages postés
1160
Date d'inscription
vendredi 23 juillet 2004
Statut
Membre
Dernière intervention
21 octobre 2010
18
@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 ;)
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Membre
Dernière intervention
30 octobre 2008
55
Pour les threads avec parametres en .net 1  et 2, tu peux voir ici

Mx
MVP C# 
Messages postés
223
Date d'inscription
mercredi 31 mai 2006
Statut
Membre
Dernière intervention
5 mai 2014

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
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Membre
Dernière intervention
30 octobre 2008
55
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# 
Messages postés
5487
Date d'inscription
dimanche 4 août 2002
Statut
Membre
Dernière intervention
20 juin 2013
59
Oui, ou au moins faire un string.Format()

<hr size="2" />VC# forever
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Membre
Dernière intervention
2 août 2014
98
Salut,

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

/*
coq
MVP Visual C#
CoqBlog
*/