CONNEXION
  • RetourJeux
    • Sorties
    • Hit Parade
    • Les + populaires
    • Les + attendus
    • Soluces
    • Tous les Jeux
    • Gaming
  • RetourActu Gaming
    • News
    • Astuces
    • Tests
    • Previews
    • Toute l'actu gaming
  • RetourBons plans
    • Bons plans
    • Bons plans Smartphone
    • Bons plans Hardware
    • Bons plans Image et Son
    • Bons plans Amazon
    • Bons plans Cdiscount
    • Bons plans Decathlon
    • Bons plans Fnac
    • Tous les Bons plans
  • RetourJVTech
    • Actus High-Tech
    • Intelligence Artificielle
    • Smartphones
    • Mobilité urbaine
    • Hardware
    • Image et son
    • Tutoriels
    • Tests produits High-Tech
    • Guides d'achat High-Tech
    • JVTech
  • RetourCulture
    • Actus Culture
    • Culture
  • RetourVidéos
    • A la une
    • Gaming Live
    • Vidéos Tests
    • Vidéos Previews
    • Gameplay
    • Trailers
    • Chroniques
    • Replay Web TV
    • Toutes les vidéos
  • RetourForums
    • Hardware PC
    • PS5
    • Switch 2
    • Xbox Series
    • Switch
    • Pokemon pocket
    • FC 25 Ultimate Team
    • League of Legends
    • Tous les Forums
  • PC
  • PS5
  • Xbox Series
  • Switch 2
  • PS4
  • One
  • Switch
  • iOS
  • Android
  • MMO
  • RPG
  • FPS
En ce moment Genshin Impact Valhalla Breath of the wild Animal Crossing GTA 5 Red dead 2
Liste des sujets

[C#] Multithreading

[_Oni_]
[_Oni_]
Niveau 6
14 juin 2010 à 00:13:30

Bonsoir à tous,

J'aurai besoin d'un peu d'aide concernant la mise en place d'un système de multithreading, qui a pour but d'éviter que mon IHM freeze lorsque un traitement lourd ce fait.

Donc voilà, dans mon programme, j'ai une fonction qui a pour rôle de tester certaine chose, tant que cette chose n'est pas faite, ca boucle et dés que c'est bon on retourne true, cette fonction ce présente comme ceci :

public bool controlebloc(int numcontrole)
{
//ici on lieu les traitements selon le numcontrole reçu
}

Le problème est que lorsqu'un traitement ce fait, le programme boucle jusqu'à ce que ca soit fait. Durant cette période, l'interface graphique est comme freezé donc si par exemple je veux mettre en place un bouton pour interrompre le traitement, je ne peux pas. Évidement, ca serait fort utilse car comme vous l'aurez compris, si le traitement ne ce fait pas==>boucle infini==>plantage

L'idée serait donc d'isolé cette fonction dans un thread à part, afin que lorsque que les traitements ce font, le thread principal ce soit pas affecté, ce qui normalement devrait éviter un freeze de l'IHM.

J'ai été sur msdn, j'ai visité plusieurs site et voilà ce qui est ressorti :

thread1 = new Thread(new ThreadStart(laFonction));
thread1.start();

Ou encore

thread1 = new Thread(new ParameterizedThreadStart(laFonction));
thread1.start();

Pour ajouter une fonction ayant aucun paramètre, il y a aucun soucis. Par contre, vu que ma fonction est booléenne et qu'elle attend un paramètre, les méthodes ci-dessus ne sembles pas fonctionné à moins que je les utilise mal.

Concrètement, ça me dit qu'aucun surcharge est prit en compte blablabla, il y a aussi une histoire de delegate dans le message d'erreur mais ça me parle pas plus que sa étant débutant :(

Ouch le pavé, j'espère avoir été clair, merci !

Paulop
Paulop
Niveau 12
14 juin 2010 à 05:37:30

static void laFonction(Object o)
{
Console.WriteLine("{0}", (string)o);
}

ParameterizedThreadStart delegue = new ParameterizedThreadStart (laFonction);

Thread thread1 = new Thread(delegue)
thread1.Start("toto");

Voila pour les paramètres (entre autre exemples).

Pour le reste, je pense que tu dois revoir la façon dont est fait ton application, si ton traitement peut ne jamais se terminer c'est qu'il y à un soucis, par curiosité, il fait quoi ?

_skip
_skip
Niveau 10
14 juin 2010 à 08:33:47

Cette méthode a l'avantage d'être type safe :

//fonction du thread
public void maFonction(int b, int c) { ... }

//exécution de la fonction
Thread th = new Thread(new ThreadStart(() => { maFonction(10, 20); }));
th.Start();

C'est une expression lambda, encore un autre exemple de l'indiscutable supériorité de C# par rapport à java. :diable:

Et pour ton problème Oni, puisque tu souhaites apparemment contrôler le thread via l'interface graphique, regarde du coté de BackgroundWorker.

http://fernandof.wordpress.com/2007/04/04/implementing-multi-threading-in-winforms-using-the-backgroundworker-class/

Sous forums
  • Aide à l'achat Mac
  • Internet
  • Macintosh
  • Création de sites web
  • Création de Jeux
  • Linux
  • Programmation
  • Steam Deck
  • Hardware
La vidéo du moment