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 de BackgroundWorker


Sujet :

C#

  1. #21
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Il me semble que malgré toutes mes explications vous n'avez toujours pas compris.

    Pourquoi ce calcul long est présent dans le RunWorkerCompleted sachant qu'il est déjà présent dans le DoWork (mais ça m'étonnerai fortement que vu son contenu la méthode soit appelée dans le DoWork sans que vous ayez eu une erreur).

  2. #22
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 38
    Par défaut
    je l'ai placé dans le dowork ,rien ne se passait. après je l'ai rajouté dans le runwork pareil. rien ne marche

  3. #23
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    J'essaye encore une fois alors :
    Le calcul long doit être effectué dans un thread différent du thread UI pour éviter qu'il freeze. Uniquement le calcul long, pas les "interactions" du calcul avec l'interface utilisateur.

    Donc si je reprends votre code, il faut "extraire" le calcul long de ce qui est fait :
    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
    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;
     
    		}
     
    		W = W2;
    	}
     
    	return Tab;
    }
    Et il faut appeler cette fonction dans le DoWork, cette méthode prenant des paramètres, il faut les transmettre dans le RunWorkerAsync :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    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)});
    Donc le DoWork, il faut diriger les paramètres vers ta méthode :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    double[] parameters = e.Arguments as double[];
    e.Result = calculLong(parameters[0], parameters[1], parameters[2], parameters[3], parameters[4], parameters[5], parameters[6], parameters[7]);
    Et enfin dans le RunWorkerCompleted, tu répercutes le résultat de ton calcul long sur tes contrôles.

  4. #24
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 38
    Par défaut
    le système ne reconnait pas les paramètres passé en argument à la fonction

  5. #25
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Certes mais quelle est l'erreur ?

    Ce forum est un forum d'aide et je pense avoir fait un peu plus que cela dans mon post précédent. Alors le code ne compile peut-être pas mais il contient l'idée pour réaliser ce que tu souhaites.

  6. #26
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 38
    Par défaut
    je sais que vous avez beaucoup fait pour moi et je vous remercie pour votre aide.

  7. #27
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Mais quelle est l'erreur ? Je vais pas vous quitter sans résoudre tout ça et que ça fonctionne pas

  8. #28
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 38
    Par défaut
    en fait j'avais rajouter ces deux ligne dans calcullong() pour pouvoir tracer un chart et remplir un richtextbox.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
     chart3.Series[0].Points.AddXY(Tab[1, i], Tab[2, i]);
     
     richTextBox214.Text = Tab[2, i] > double.Parse(richTextBox92.Text) ? ">Max time" : Tab[1, i].ToString();
    un problème d'inter-thread apparaît.

  9. #29
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Comme je l'ai déjà dit (et redit), il n'est pas possible d'agir directement sur les contrôles

    Le DoWork retourne le tableau en résultat, vous pouvez donc vous en servir pour mettre à jour l'affichage.

    Ou sinon méthode plus complexe, utiliser le Invoke, en faisant là où vous le voulez dans le DoWork (bon je suis même plus sûr de la syntaxe) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chart3.Invoke(delegate() {chart3.Series[0].Points.AddXY(Tab[1, i], Tab[2, i]);}
    Et

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    richTextBox214.Invoke(delegate() { richTextBox214.Text = Tab[2, i] > double.Parse(richTextBox92.Text) ? ">Max time" : Tab[1, i].ToString();}

  10. #30
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 38
    Par défaut
    Citation Envoyé par ostenhard Voir le message
    Mais quelle est l'erreur ? Je vais pas vous quitter sans résoudre tout ça et que ça fonctionne pas
    c'est l'erreur dont je t'ai parler au début:
    La référence d'objet n'est pas définie à une instance d'un objet.

  11. #31
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 38
    Par défaut
    Citation Envoyé par ostenhard Voir le message
    Comme je l'ai déjà dit (et redit), il n'est pas possible d'agir directement sur les contrôles

    Le DoWork retourne le tableau en résultat, vous pouvez donc vous en servir pour mettre à jour l'affichage.

    Ou sinon méthode plus complexe, utiliser le Invoke, en faisant là où vous le voulez dans le DoWork (bon je suis même plus sûr de la syntaxe) :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    chart3.Invoke(delegate() {chart3.Series[0].Points.AddXY(Tab[1, i], Tab[2, i]);}
    il faut juste rajouter ça

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    richTextBox214.Invoke(delegate() { richTextBox214.Text = Tab[2, i] > double.Parse(richTextBox92.Text) ? ">Max time" : Tab[1, i].ToString();}


    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]);}

  12. #32
    Membre averti
    Inscrit en
    Octobre 2010
    Messages
    38
    Détails du profil
    Informations forums :
    Inscription : Octobre 2010
    Messages : 38
    Par défaut
    cette erreur s'affiche au niveau de la déclaration du tableau parameters[]

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     double[] parameters = e.Argument as double[];
    La référence d'objet n'est pas définie à une instance d'un objet

  13. #33
    Membre très actif
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2010
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2010
    Messages : 237
    Par défaut
    Bonjour,
    j'ai suivi toute les instruction et j'ai essayé de les appliquez.j'ai eu la même erreurs que infose.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     double[] parameters=new double [15];
                parameters = e.Argument as double[];

  14. #34
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Et en mode pas à pas que contient e.Argument ? Et e tout court ?

  15. #35
    Membre très actif
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2010
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2010
    Messages : 237
    Par défaut
    a peux prêt la même chose que su le code de infose. juste le nombre d'argument est inférieure.

  16. #36
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Je dis en mode pas à pas donc pendant l'exécution !

  17. #37
    Membre très actif
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2010
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2010
    Messages : 237
    Par défaut
    J'avais dit la même erreurs que infose

    La référence d'objet n'est pas définie à une instance d'un objet
    Images attachées Images attachées  

  18. #38
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Bon alors formulé autrement : e est-il null ? e.Argument est-il null ?
    J'avais compris que vous aviez une NullReferenceException

  19. #39
    Membre très actif
    Profil pro
    Étudiant
    Inscrit en
    Septembre 2010
    Messages
    237
    Détails du profil
    Informations personnelles :
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Septembre 2010
    Messages : 237
    Par défaut
    Citation Envoyé par ostenhard Voir le message
    Bon alors formulé autrement : e est-il null ? e.Argument est-il null ?
    J'avais compris que vous aviez une NullReferenceException
    J'ai pas trop saisi ce que vous voulez dire?
    moi j'ai déclaré le e.argument comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    double[] parameters=new double [15];
                parameters = e.Argument as double[];
    e.Result =  Equation(parameters[0], parameters[1], parameters[2], parameters[3], parameters[4]);

  20. #40
    Membre émérite
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Juillet 2007
    Messages
    693
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Consultant informatique

    Informations forums :
    Inscription : Juillet 2007
    Messages : 693
    Par défaut
    Si vous avez une NullReferenceException, regardez ce qui est nul sur la ligne sur laquelle l'erreur est levée !

Discussions similaires

  1. [Débutant] utilisation de BackgroundWorker
    Par geekploy dans le forum VB.NET
    Réponses: 4
    Dernier message: 15/01/2014, 00h35
  2. Comment utiliser un backgroundworker (vb.net 2005) ?
    Par Aspic dans le forum Contribuez
    Réponses: 1
    Dernier message: 23/04/2013, 17h22
  3. Exemple d'utilisation du BackgroundWorker
    Par infosam76 dans le forum Contribuez
    Réponses: 0
    Dernier message: 06/12/2012, 22h15
  4. Utilisation du BackgroundWorker
    Par jlm22 dans le forum VB.NET
    Réponses: 12
    Dernier message: 15/04/2011, 16h13

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