IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C# Discussion :

utilisation des thread


Sujet :

C#

  1. #1
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 89
    Par défaut utilisation des thread
    Bonjoru à tous,

    sous c# je rencontre un petit problème:

    dans mon main j'affiche un winform et je rentre tout de suite après dans une petite boucle. Le problème c'est que tous les éléments de mon WinForm ne s'affiche pas, comme si c'était figé.

    voici une partie des instructions:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    Form maForm= new Form();
    maForm.Show();
     
    for(i=0;i<3;i++)
    {
    System.Threading.Thread.Sleep(5000);
    }
    Faut il que j'execute mon Winform avec une thread ?

  2. #2
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Par défaut
    MaForm.Update?

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 89
    Par défaut
    maForme.Update();

    met bien a jour la fenetre mais elle est non déplaçable, est au bout de quelques seconde on a le message suivant : "ne repond pas"

    l'idéal je pense serait d'executer les deux taches en même temps mais je ne sais pas comment faire.

  4. #4
    Membre Expert

    Homme Profil pro
    Développeur .NET
    Inscrit en
    Novembre 2010
    Messages
    2 067
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur .NET

    Informations forums :
    Inscription : Novembre 2010
    Messages : 2 067
    Par défaut
    Le thread sleep bloque aussi l'UI, pourquoi veux tu faire ça ?

    Sinon si tu veux éxecuter d'autre opération sans bloquer ta form tu as le backgroundworker

  5. #5
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 89
    Par défaut
    j'ai une fenetre qui affiche l'avancement de la boucle, j'aimerais incrémenter la barre de progression de mon WinForm a chaqie iteration de la boucle for.

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Octobre 2013
    Messages
    1 563
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : Industrie

    Informations forums :
    Inscription : Octobre 2013
    Messages : 1 563
    Par défaut
    Citation Envoyé par movlw Voir le message
    j'ai une fenetre qui affiche l'avancement de la boucle, j'aimerais incrémenter la barre de progression de mon WinForm a chaqie iteration de la boucle for.
    Un panel sur cette même fenêtre ne serait-il pas plus adapté?

  7. #7
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 89
    Par défaut
    ZenZitone je ne comprends pas.

    dans program.cs, j'ai un main. Dans ce programme principal je j'instancie maForm, et juste après je commence mon traitement dans la boucle.

  8. #8
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    l'application démarre sur le thread par défaut
    ton code est exécuté sur ce thread, mais ce thread sert aussi au code de base des forms et des controles pour l'affichage

    aussi dès qu'on fait quelque chose qui potentiellement peut durer plus d'une demi seconde, il faut le faire sur un autre thread
    la classe thread est assez simple, un thread démarre sur un void et s'arrête à la fin du void
    pour un thread infini on fait un while true avec un thread.sleep(1) dedans (1 ou plus)

    ! : il est impossible de modifier l'interface (les propriétés des controles) depuis un thread secondaire, il faut alors passer par uncontrol.invoke

    sinon il y a aussi le backgroundworker, qui implémente tout ce qu'il faut généralement pour les threads
    il a 3 évents :
    - dowork qui est appelé pour le démarrage, dans cette méthode sera le code du thread secondaire
    - reportprogress qui est appelé quand depuis dowork on défini la progression (possibilité de passer des variables)
    - completed qui est appelé à la sortie du work (possibilité de passer une variable aussi)
    l'avantage est que les 2 derniers évents cités sont levés sur le thread principal, ca évite de comprendre le mécanisme des invoke et la mise à jour de l'interface est possible
    (attention le .cancel du backgroundworker n'est pas implicite, il faut le coder soi même)
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  9. #9
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 89
    Par défaut
    J'ai essayé avec des thread mais pas moyen de faire ce que je veux

    Pouvez vous me donner un exemple à partir du code de départ que j'ai écrit precedement?

  10. #10
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 89
    Par défaut
    J'ai essayé ceci mais j'obtiens le meme resultat

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
           Thread thread = new Thread(myForm.Show);
            thread.Start();

  11. #11
    Membre confirmé
    Profil pro
    Inscrit en
    Juin 2007
    Messages
    49
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations forums :
    Inscription : Juin 2007
    Messages : 49
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    Thread thread = new Thread(myForm.Show);
    thread.Start();
    Avec se code tu tente d'afficher le form dans un autre Thread que le principal ... Je me demande même comment sa peut se lancer sans crasher Direct (mais je fait du WPF pas du Winform).

    L'utilisation des Threads n'est pas trivial, je te conseil soit :
    - De te documenter sur les thread en général (beaucoup,beaucoup,beaucoup), les thread dans windows , les threads dans une application Winform, tout cela avec plein d’exercice avant de commencer quoique se soit.

    - D'utiliser le backgroundworker comme dit par youtpout978, il masque une bonne partie de la complexité inhérente au Thread et pour ton exemple ces fonctionnalités me semble suffisante.

    C'est un sujet passionnant mais qui demande des connaissances de bas niveau ( au sens informatique du terme , comment un ordinateur stocke des données , commente gère t-il le temps processeur , les emplacement mémoires et leur partage...).

    Juste pour info quand tu appelle Show sur ta Form tu te dit je demande au PC d'afficher la fenêtre ... Et bien non !!!! Tu lui demande en fait d'afficher la fenêtre la prochaine fois qu'il auras décidé qu'il à le temps de la faire !!!

    Bon courage.

  12. #12
    Expert éminent Avatar de Pol63
    Homme Profil pro
    .NET / SQL SERVER
    Inscrit en
    Avril 2007
    Messages
    14 204
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 44
    Localisation : France, Puy de Dôme (Auvergne)

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 204
    Par défaut
    ce n'est pas le show qu'il faut mettre dans un thread, mais ta boucle qui prend du temps (il faut donc la mettre dans un autre void)

    après le multithreading ca peut être compliqué, mais ce n'est pas pour autant qu'il ne faut pas se lancer, et découvrir les bugs après (genre 1+1+1 = 2, la première fois ça fait bizarre)

    quand à connaitre le fonctionnement en bas niveau, c'est intéressant pour tout le reste aussi ^^
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  13. #13
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Juillet 2014
    Messages
    89
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2014
    Messages : 89
    Par défaut
    merci à tout vos messags, je vais prendre des cours sur les thread, et le background me semble interessant également !

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Avis sur la bonne utilisation des Threads
    Par Pitivier dans le forum Général Java
    Réponses: 8
    Dernier message: 28/11/2006, 21h07
  2. connexion socket utilisant des threads
    Par alceste dans le forum C++
    Réponses: 16
    Dernier message: 14/10/2006, 13h00
  3. [Débutant]Utilisation des Threads
    Par maniolo dans le forum Débuter avec Java
    Réponses: 19
    Dernier message: 10/07/2006, 12h31
  4. Utilisation des threads
    Par Valinor dans le forum Linux
    Réponses: 2
    Dernier message: 30/11/2005, 17h41
  5. Utilisations des Threads
    Par phoenix440 dans le forum Réseau
    Réponses: 15
    Dernier message: 21/08/2005, 18h19

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo