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 et perte de donnée


Sujet :

C#

  1. #1
    Membre confirmé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Points : 637
    Points
    637
    Par défaut Thread et perte de donnée
    Bonjour,

    Dans une boucle je declenche un thread qui appele une methode, mais voila la methode n'est pas executé a chaque fois et de facon aleatoire.

    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
    17
    18
    19
    20
    21
    22
     
     for (short nI = 0; nI < oMatchCollection.Count; nI++)
                {
                    oRegex = new Regex(@"\s");
                    film = oRegex.Replace(oMatchCollection[nI].Value, " ");
     
                    Thread t = new Thread(() => displayedStatus(data));
                    t.Start();
                }
     
     private void displayedStatus(string data) 
            {
                displayed = new displayedStatusDelegate(displayedStatus);
     
                if (textBox1.InvokeRequired)
                {
                    textBox1.Invoke(displayed, data);
                    return;
                }
                textBox1.AppendText(data);
                textBox1.AppendText(Environment.NewLine);
            }

    Avez vous une idee de cette perte de données ?

    Merci à vous
    MCTS Microsoft.
    La conception : Prendre le temps pour gagner du temps.

  2. #2
    Membre habitué Avatar de swif79
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 79
    Points : 169
    Points
    169
    Par défaut
    En fait ton thread n'as pas le temps de finir son boulot entre chaque itération. Tu peux essayer çà :

    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
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
     
     
    for (short nI = 0; nI < oMatchCollection.Count; nI++)
                {
                    oRegex = new Regex(@"\s");
                    film = oRegex.Replace(oMatchCollection[nI].Value, " ");
     
                    Thread t = new Thread(() => displayedStatus(data));
                    t.Start();
     
                     while ((t.ThreadState == ThreadState.Running))
                          System.Threading.Thread.Sleep(10);
                }
     
     private void displayedStatus(string data) 
            {
                displayed = new displayedStatusDelegate(displayedStatus);
     
                if (textBox1.InvokeRequired)
                {
                    textBox1.Invoke(displayed, data);
                    return;
                }
                textBox1.AppendText(data);
                textBox1.AppendText(Environment.NewLine);
            }
    La l’intérêt du thread je n'en vois pas ton traitement n'est pas long et tout se fait de manière séquentiel. Pourquoi choisis tu d'utiliser un thread ?

  3. #3
    Membre confirmé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Points : 637
    Points
    637
    Par défaut
    Ca à l'air de fonctionner.

    Mille merci, mais y a pas une facon plus propre que de faire une pause d'un temps mit au pif ? car si y a des latences reseau ou des traitements plus lourd en amont, le 10 mms ne suffira plus.
    MCTS Microsoft.
    La conception : Prendre le temps pour gagner du temps.

  4. #4
    Membre habitué Avatar de swif79
    Homme Profil pro
    Développeur .NET
    Inscrit en
    Juillet 2009
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations professionnelles :
    Activité : Développeur .NET
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Juillet 2009
    Messages : 79
    Points : 169
    Points
    169
    Par défaut
    Hein ?
    le Sleep n'est là que pour éviter d'avoir une boucle trop gourmande en ressource, le temps d'attente est déterminé par le temps d’exécution du thread.

    Mais je ne comprends toujours pas pourquoi tu utilise un thread.

  5. #5
    Membre confirmé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Points : 637
    Points
    637
    Par défaut
    J'utilise un thread car je veux afficher en tps reel sur mon UI les traitements finis
    MCTS Microsoft.
    La conception : Prendre le temps pour gagner du temps.

  6. #6
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Ton thread ne sert absolument à rien en l'état car le code de ce thread modifie uniquement l'UI (pas de calcul ou de traitement lourd, juste changer le texte d'une TextBox). Autant faire un Invoke direct, voire pas d'Invoke si tu es de base dans le thread UI.

    Lorsque l'on gère des opérations longues qui peuvent bloquer l'affichage c'est le traitement en question qui doit être exécuté dans un thread. Et on fait de l'Invoke pour la progression lorsque c'est nécessaire. Là tu fais un thread juste pour faire l'Invoke et ça s'annule mutuellement puisque InvokeRequired sera toujours à true
    Pas de questions techniques par MP

  7. #7
    Membre confirmé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Points : 637
    Points
    637
    Par défaut
    En faite mon thread appelle une methode qui a pour but de faire de gros traitement de fichier, et cette methode de traitement mets a jour mon UI afin de voir quel fichiers a ete traité.

    Est ce coherent ?
    MCTS Microsoft.
    La conception : Prendre le temps pour gagner du temps.

  8. #8
    Expert éminent
    Avatar de StormimOn
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2005
    Messages
    2 593
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France, Sarthe (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 2 593
    Points : 7 660
    Points
    7 660
    Par défaut
    Oui mais de ce que je comprends, lorsque tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    Thread t = new Thread(() => displayedStatus(data));
    tu es déjà dans ton traitement lourd, et donc dans un thread à part. C'est bien ça ?

    A ce moment c'est inutile de faire un autre thread juste pour afficher la progression, puisque si le thread sert juste à faire l'Invoke alors le thread en question ne sert à rien. Il faut faire l'Invoke directement.

    Par exemple avec une méthode qui servira à réaliser l'invoke (dans le principe la méthode se trouve sur une Form, this représente donc la Form).
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    public void InvokeMethod(MethodInvoker invoker)
    {
        if (this.InvokeRequired)
        {
            this.Invoke(invoker);
        }
        else
        {
            invoker();
        }
    }
    L'avantage étant de n'avoir qu'une seule méthode (pas la peine d'en faire une pour chaque contrôle de la Form). Il faut juste remplacer le délégué MethodInvoker (System.Windows.Forms) par Action à partir du framework 3.5.

    Et pour l'appel on utilise une méthode anonyme (ou bien une expression lambda si disponible).
    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
    public void MonTraitementLourdDansUnAutreThread()
    {
        do
        {
            // Traitement lourd
            ...
            // Progression
            InvokeMethod(
                delegate
                {
                    maTextBox.Text = "...";    
                });
        }
        while (condition);
    }
    Pas de questions techniques par MP

  9. #9
    Membre confirmé
    Avatar de topolino
    Profil pro
    Inscrit en
    Juillet 2003
    Messages
    1 901
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 901
    Points : 637
    Points
    637
    Par défaut
    Merci c'est plus clair pour moi.
    MCTS Microsoft.
    La conception : Prendre le temps pour gagner du temps.

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

Discussions similaires

  1. [MFC] CSocket | perte de données
    Par Grey dans le forum MFC
    Réponses: 2
    Dernier message: 24/11/2005, 10h14
  2. Perte de donnée
    Par spikto dans le forum Langage
    Réponses: 2
    Dernier message: 27/10/2005, 16h03
  3. Perte de données Firebird
    Par jeanafond dans le forum Débuter
    Réponses: 8
    Dernier message: 19/05/2005, 10h21
  4. Crash InnoDB,perte de données définitives... Info ou Intox ?
    Par Alexandre T dans le forum Administration
    Réponses: 3
    Dernier message: 17/01/2005, 10h44
  5. [JTable] Perte des données
    Par david71 dans le forum Composants
    Réponses: 8
    Dernier message: 09/01/2005, 00h37

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