J'ai terminé mon petit projet qui fait un gros travail. J'ai réalisé dans ce court temps de calcul, mon interface graphique se fige. J'ai donc fait quelques recherches et j'ai trouvé ceci =>http://www.codeproject.com/Articles/4381/Threading-out-tasks-in-a-C-NET-GUIDémarrage d'un nouveau thread avec un constructeur
J'ai commencé à implémenter ceci est mon projet, mais j'ai réalisé que cette implémentation particulière ne fonctionnait pas dans mon projet.
Dans mon projet, j'ai beaucoup de classes et un "manager" qui contrôle toutes les autres classes. Si j'initise cette classe Manager, elle fait déjà le gros du travail dans le constructeur.
à ma question:
Comment démarrer i un nouveau thread avec un contructor?
private void fileWatcher_Changed(object sender, System.IO.FileSystemEventArgs e)
{
if (System.IO.File.Exists(e.FullPath) == true)
{
Manager mgr = new Manager(e, handreader); // here starts the heavy lifting
Thread mgrThread = new Thread(new ThreadStart(mgr)); // what to do ?
sl.Text = mgr.test();
txtLog.Text = mgr.output();
}
}
EDIT: j'ai décidé de recoder bien mon programme. maintenant le levage lourd est dans une fonction mais je pense que j'ai fait une erreur.
tout le programme ressemble à ceci:
private void fileWatcher_Changed(object sender, System.IO.FileSystemEventArgs e)
{
if (System.IO.File.Exists(e.FullPath) == true)
{
Manager mgr = new Manager(e, handreader, txtLog, sl);
//sl.Invoke(new MethodInvoker(mgr.test));
sl.Invoke(new MethodInvoker(mgr.test)); // first try
Thread mgrThread = new Thread(new ThreadStart(mgr.test)); // second try
}
}
les sl.Invoke(new MethodInvoker(mgr.test)); // first try
œuvres, mais il gèle encore mon interface graphique.
Thread mgrThread = new Thread(new ThreadStart(mgr.test)); // second try
et cette ligne ne fait rien.
ma fonction de test:
public void test()
{
StringBuilder builder = new StringBuilder();
foreach (PlayerController pc in fm.lPc)
{
Range range = new Range(handReader.hand, handReader.handversus, pc);
builder.Append(pc.getHeroCardsSimple()+" vs 100% range = "+range.vsRange()+"\r\n");
}
sl.Text = builder.ToString();
}
Même si cela répond à la question principale, je suis d'accord avec Jon: Ne pas faire de lourdes charges dans un constructeur! – ChrFin
Oui, bien sûr, mais c'est une question différente – Bas