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 d'une TPL 'RunSynchronously'


Sujet :

C#

  1. #1
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 38
    Par défaut utilisation d'une TPL 'RunSynchronously'
    Bonjour à tous,
    J'ai créer un programme afin qu'il freeze pas j'aimerais utiliser une TPL,
    mon programme tourne d'une manière synchrone,c'est pourquoi j'utilise RunSynchronously();
    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
       private void button1_Click(object sender, EventArgs e)
            {
                Task t = new Task(() => chart1_Click());
                Task t2 = new Task(() => chart17_Click());
     
                t.RunSynchronously();
     
                t2.RunSynchronously();
     
              try
              {
                  Task.WaitAll(new[] { t, t2 });
              }
              catch (AggregateException)
              { }
     
            }
    Le problème c'est qu'il freeze toujours .

    Merci de m'aider.

  2. #2
    Invité
    Invité(e)
    Par défaut
    est qu'on peut voir le contenu de ta méthode RunSynchronously ? et ainsi s'il lance bien un tread indépendant du thread de ton form.

  3. #3
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 38
    Par défaut
    RunSynchronously fait partie de la classe du système:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    using System.Threading.Tasks;

  4. #4
    Invité
    Invité(e)
    Par défaut
    Autant pour moi . Ben j'ai jamais eu à utiliser cette méthode.

    Bon pour en revenir au problème.

    le plus simple pour ne pas freezer ton UI est de mettre tout le contenu de ta méthode button1_Click dans une autre méthode maMethode.

    A partir de ta méthode button1_Click tu instancies un objet Thread ou un objet BackgroundWorker qui se chargera de lancer ta méthode créer auparavant c'est à dire maMethode et là c'est sûr que ton UI ne freezera pas.

  5. #5
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 38
    Par défaut
    j'ai déjà essayer d'utiliser le becvkgroundworker mais j'ai pas réussi car mon programme est un peu exceptionnelle.

  6. #6
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par infose Voir le message
    j'ai déjà essayer d'utiliser le becvkgroundworker mais j'ai pas réussi car mon programme est un peu exceptionnelle.
    Pourquoi t'as pas réussi à mettre en place le BackgroundWorker : Execption ?

    et aussi en quoi ton programme est exceptionnel ?

  7. #7
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 38
    Par défaut
    j'avais une erreur comme quoi mes paramètres sont null,même si c'est pas le cas!!!!!!

  8. #8
    Invité
    Invité(e)
    Par défaut
    De toute façon ton programme freeze parce que le corps de ta méthode on a l'instruction :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    Task.WaitAll(new[] { t, t2 });
    ce qui bloque le thread appelant en l’occurrence le thread de ton UI.

    Citation Envoyé par infose Voir le message
    j'avais une erreur comme quoi mes paramètres sont null,même si c'est pas le cas!!!!!!
    Sois un peu plus précis ou tout simplement mets nous le code dans lequel il y avait le BackgroundWorker stp.

  9. #9
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 38
    Par défaut
    Dan mon Dowork j'ai mis ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
     
    double[] parameters=new double [15];
                parameters = e.Argument as double[];
    e.Result =  Equation(parameters[0], parameters[1], parameters[2], parameters[3], parameters[4]);
    Dans le runwork j'ai ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     
     
    wb.RunWorkerAsync(new double[] { double.Parse(richTextBox92.Text), double.Parse(richTextBox6.Text), double.Parse(richTextBox54.Text), double.Parse(richTextBox3.Text) * 250, double.Parse(richTextBox148.Text), double.Parse(richTextBox149.Text), double.Parse(richTextBox146.Text), double.Parse(richTextBox147.Text)});
    ma foction est la suivante

    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
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
     
    public double[,] calculLong(double Fin, double W0, double Pasdetemps, double J, double richTextBox148Value, double richTextBox149Value, double richTextBox146Value, double richTextBox147Value)
    {
    	//valeur calcul
    	double W2;
    	double Couple;
     
    	double[,] Tab = new double[4,40000];
    	double W = W0;
    	double Temps = 0;
     
    	for (int i = 1; i <= 4000; i++)
    	{
     
    		Tab[1, i] = Temps;
    		Tab[2, i] = W * 30 / Math.PI;
     
    		Temps = Temps + Pasdetemps;
    		Couple = richTextBox148Value * Math.Pow(W, 2) + richTextBox149Value * W + richTextBox146Value * Math.Pow(W, 0.5) + richTextBox147Value;
    		W2 = W + ((Couple * Pasdetemps) / J);
    		double Diff = W - W2;
     
    		 Tab[1, i+1] = Temps;
    		 Tab[2, i+1] = W * 30 / Math.PI;
    		if (Diff < Fin)
    		{
    			Tab[1, i + 2] = Temps;
    			Tab[2, i + 2] = W * 30 / Math.PI;
    		}
    		if (W < Fin)
    		{
    			Tab[1, i + 3] = Temps + Pasdetemps;
    			Tab[2, i + 3] = 0;
     
    		}
     
    		chart3.Invoke(new MethodInvoker(delegate() {chart3.Series[0].Points.AddXY(Tab[1, i], Tab[2, i]);}
    	}
     
     
    }
    et en fin j'ai mis un bouton pour exécuter le code:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private void click_yy(object sender, EventArgs e)
            {
                if (bw.IsBusy != true)
     
                    bw.RunWorkerAsync();
     
                else MessageBox.Show("wait");
     
            }

  10. #10
    Invité
    Invité(e)
    Par défaut
    Je pense que l'erreur se trouve dans le code ton gestionnaire du bouton ci-dessous.
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    private void click_yy(object sender, EventArgs e)
            {
                if (bw.IsBusy != true)
     
                    bw.RunWorkerAsync();
     
                else MessageBox.Show("wait");
     
            }

    Tu appelles la méthode RunWorkerAsync sans lui fournir le tableau en paramètre. En faisant ainsi le gestionnaire de l'évènement DoWork de ton BackgroundWorker, qui lui attendant un tableau essaie de caster l'argument e.Argument en tableau ce qui renverra null vu rien n'a été passé en paramètre au moment de l'appel de RunWorkerAsync.
    Pour que ça marche remplace dans le code ci-dessus :
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    bw.RunWorkerAsync();
    par
    Code C# : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    bw.RunWorkerAsync(new double[] { double.Parse(richTextBox92.Text), double.Parse(richTextBox6.Text), double.Parse(richTextBox54.Text), double.Parse(richTextBox3.Text) * 250, double.Parse(richTextBox148.Text), double.Parse(richTextBox149.Text), double.Parse(richTextBox146.Text), double.Parse(richTextBox147.Text)});
    Dernière modification par Deepin ; 29/10/2010 à 15h38. Motif: Nettoyage

  11. #11
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 38
    Par défaut
    oui l'as j'ai plus d'erreurs mais j'arrive pas à tracer mon graphes et je comprends pas pourquoi.

  12. #12
    Invité
    Invité(e)
    Par défaut
    Est tu sûr d'être abonné à l'évènement RunWorkerCompleted de ton BackgroundWorker. Si ou peux tu nous mettre le code du gestionnaire d'évènements de cette évènement stp.

  13. #13
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 38
    Par défaut
    Je pense avec le code que j'ai posté au dessus je suis relié à cet évènement,
    Je sais pas comment vous expliquer ça mais quand je clique sur le bouton j'ai pas le graphes mais une sorte de graphes dynamique qui bouge et à chaque fois il rajoute un points ma ligne bouge et ainsi de suite.

  14. #14
    Invité
    Invité(e)
    Par défaut
    Vérifie bien que dans le DoWork que la méthode calculLong est bien appelée. Je pense que la ligne suivante :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chart3.Invoke(new MethodInvoker(delegate() {chart3.Series[0].Points.AddXY(Tab[1, i], Tab[2, i]);}
    est un peu douteuse.
    Normalement cette ligne qui devrait mettre à jour l'UI si je ne me trompe pas.
    Fais du pas à pas et mettre des breakpoints pour voir ce qui se passe réellement

  15. #15
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 38
    Par défaut
    le mode pas a pas avec des espions ne me donne pas les valeurs insérer dans le chart juste les infos général du chart.

Discussions similaires

  1. [Débutant(e)] JSP utilisation static....une autre
    Par tcgenrecom dans le forum Servlets/JSP
    Réponses: 2
    Dernier message: 01/03/2004, 15h27
  2. utilisation d'une variable globale
    Par ZZ dans le forum ASP
    Réponses: 3
    Dernier message: 03/12/2003, 19h11
  3. Utilisation d'une variable sur plusieurs unités
    Par Yamaneko dans le forum Langage
    Réponses: 2
    Dernier message: 05/06/2003, 11h23
  4. Utilisation d'une dll écrite en delphi 5 dans VB6
    Par Jean-Louis dans le forum Langage
    Réponses: 4
    Dernier message: 05/08/2002, 09h19
  5. Réponses: 4
    Dernier message: 05/06/2002, 14h35

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