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 :

Thread/Timer qui se mélange


Sujet :

C#

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Janvier 2014
    Messages : 63
    Points : 44
    Points
    44
    Par défaut Thread/Timer qui se mélange
    Bonjour,

    Actuellement en train de découvrir les threads, j'ai décidé de revoir mon application avec l'utilisation des threads avant d'avancer trop loin dans le projet, seulement je rencontre beaucoup de problème (en faite à chaque modification de mon code j'ai un problème...)

    Cette fois ci, ce sont mes threads qui lance un timer "maison" qui se mélange, du moins je pense car à débugger c'est pas simple du tout.
    Il y a pour l'instant dans mon code 2 thread "enfant" en plus du thread d'origine.

    Alors voici le code d'un bouton qui démarre 1 thread:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    private void Timer1_Click(object sender, EventArgs e)
            {
                    AiIMP++;
                    tabIMP[AiIMP] = "iram010" + AiIMP;
                    Thread t1 = new Thread(new ParameterizedThreadStart(obj => { lancementTimer(e); }));
                    t1.Start();
            }
    Le thread va donc lancer cette méthode:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    public void lancementTimer(EventArgs e)
            {
                int i = 0; int idthread = ++id;
                while (true)
                {
                        i++;
                        Invoke((vider)viderTB);
                        Invoke((montrerSpool)ajoutTB, "Timer vaut " + i + ". Thread N° " + idthread);
                        //lectureSpooler(nomIMP);
                        if (i == 10000)
                        {
                            i = 0;
                        }
                        Thread.Sleep(500);
                }
            }
    Dans cette méthode, les deux Invoke font référence à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
            public void ajoutTB(string valeur)
            {
                lock (_lock)
                {
                    int i;
                    for (i = 0; i < 5; i++)
                    {
                        if (tabIMP[i] == "iram0101") { textBox1.Text += (valeur) + Environment.NewLine; }
                        if (tabIMP[i] == "iram0102") { textBox2.Text += (valeur) + Environment.NewLine; }
                        if (nomIMP == "iram0103") { textBox3.Text += (valeur) + Environment.NewLine; }
                        if (nomIMP == "iram0104") { textBox4.Text += (valeur) + Environment.NewLine; }
                    }
                }
            }
    Et:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     public void viderTB()
            {
                int i;
                for (i = 0; i < 5; i++)
                {
                    if (tabIMP[i] == "iram0101") { textBox1.Clear(); }
                    if (tabIMP[i] == "iram0102") { textBox2.Clear(); }
                    if (nomIMP == "iram0103") { textBox3.Clear(); }
                    if (nomIMP == "iram0104") { textBox4.Clear(); }
                }
            }
    Lorsque je clique sur mon bouton qui démarre la méthode "Timer1_Click", aucun problème, tout ce déroule très bien mais lorsque que je veux ajouter un second thread en plus du premier, tout se mélange, le premier thread apparait dans les deux textBox ainsi que le deuxième.

    Je vous donne le code du deuxième thread:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
            private void Timer2_Click(object sender, EventArgs e)
            {
                    AiIMP++;
                    tabIMP[AiIMP] = "iram010" + AiIMP;
                    Thread t2 = new Thread(new ParameterizedThreadStart(obj => { lancementTimer2(e); }));
                    t2.Start();
            }
    Identique au premier donc, seul la méthode lancé par ce thread est différent afin qu'il est un timer différent chacun.

    J'en conclu donc qu'il doit y avoir un problème lors que l'affichige, j'ai essayé de mettre un lock dans la méthode "ajoutTB" mais rien ne change.
    Je pense que je n'ai pas encore tout à fait compris le concept des threads mais la je suis complétement dans l'impasse, quelqu'un aurait il une solution et une explication à me donner?

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    viderTb et ajoutTb modifient les même textboxes, si tu veux que chaque thread utilise des textboxes différents il faut un paramètres sur tes 2 méthodes pour leur dire quel textbox utiliser plutot que de le coder en dur

    après un thread ne sert à rien ici
    un thread est utile quand il y a un temps de traitement assez long (au moins quelques centaines de ms) qui peut être fait sur un autre thread
    ici tu modifies des controles et tu attends, donc rien d'utile, pour ca il est recommandé d'utiliser un timer
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Janvier 2014
    Messages : 63
    Points : 44
    Points
    44
    Par défaut
    Je suis d'accord avec toi pour la charge de travail faible que cela représente.

    Par contre par la suite, chaque thread devra analyser un spool d'impression en boucle et faire un post traitement par la suite, est ce utile dans ce cas de passer sur plusieurs thread, ou alors resté sur le thread unique de lancement?

  4. #4
    Membre éprouvé
    Homme Profil pro
    Architecte technique
    Inscrit en
    Septembre 2005
    Messages
    462
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Maine et Loire (Pays de la Loire)

    Informations professionnelles :
    Activité : Architecte technique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 462
    Points : 1 056
    Points
    1 056
    Par défaut
    Pour compléter la réponse de Sébastien.

    Il y a un principe qui est important en programmation objet : YAGNI.
    La programmation objet te permet d'écrire du code de "qualité" mais permet aussi de crée une usine a gaz...


    Tant que l'on ne t'a pas parler(ou que tu n'as pas constaté) de problème de performance, je te conseille d'écrire un code qui gère déjà parfaitement ton besoin et ensuite si il faut utiliser des threads...

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

    Informations professionnelles :
    Activité : .NET / SQL SERVER

    Informations forums :
    Inscription : Avril 2007
    Messages : 14 154
    Points : 25 072
    Points
    25 072
    Par défaut
    Citation Envoyé par FruitSellers Voir le message
    Par contre par la suite, chaque thread devra analyser un spool d'impression en boucle et faire un post traitement par la suite, est ce utile dans ce cas de passer sur plusieurs thread, ou alors resté sur le thread unique de lancement?
    oui ca peut etre utile

    Citation Envoyé par katkiller Voir le message
    Tant que l'on ne t'a pas parler(ou que tu n'as pas constaté) de problème de performance, je te conseille d'écrire un code qui gère déjà parfaitement ton besoin et ensuite si il faut utiliser des threads...
    sur le principe je serais d'accord, après il est important d'apprendre le multithreading, ce n'est pas forcément compliqué pour des choses simples, et c'est bête de s'en passer dans la plupart des cas
    hormis le fait que le nombre de core évolue et qu'il y a toujours au moins 2 de nos jours, travailler sur le thread principal pour du traitement serait même à déconseiller
    un timer pour du code qui prend moins de 30ms toute les seconde oui, mais si on fait 10 choses comme ca dans l'appli on se retrouve avec 300ms par seconde et l'appli devient lente à utiliser, donc autant déporter tout ce qui est déportable, qui consomme un peu (ou qui est potentiellement source de timeout)
    donc à voir si le traitement sur le pool prend 2 ou 20ms
    mais la première étape est bien de coder le truc qui marche, regarder ensuite le temps que ca prend dans plusieurs cas de test (system.diagnostics.stopwatch) et éventuellement donc de l'adapter pour travailler sur un autre thread
    Cours complets, tutos et autres FAQ ici : C# - VB.NET

  6. #6
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2014
    Messages
    63
    Détails du profil
    Informations personnelles :
    Localisation : France, Seine Maritime (Haute Normandie)

    Informations forums :
    Inscription : Janvier 2014
    Messages : 63
    Points : 44
    Points
    44
    Par défaut
    Ok, merci pour tout ces conseils.

    Je vais donc revenir sur une solution plus simple, d'autant que j'ai peur que mes compétences soit encore trop limité (je suis encore en étude) pour réaliser un projet aussi vaste auprès d'une technique que je ne maitrise absolument pas.

Discussions similaires

  1. Thread + Timer CallBack
    Par crevygood dans le forum Windows Forms
    Réponses: 1
    Dernier message: 05/06/2007, 10h44
  2. Indicateur d'avancement et timer qui bouge pas
    Par papadrago dans le forum Delphi
    Réponses: 6
    Dernier message: 04/02/2007, 00h32
  3. Thread Timer et Tcomposant
    Par cfalcot dans le forum Delphi
    Réponses: 11
    Dernier message: 19/12/2006, 10h00
  4. [MFC] Problème de Threads + Timers
    Par Invité dans le forum MFC
    Réponses: 8
    Dernier message: 30/11/2005, 10h51

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