none
d'autres problêmes sur le backgroundWordker RRS feed

  • Question

  • bonjour

    J'ai un problème j'ai suivi le compilateur pour mettre la fonction en public et static:

    	public:
    		MainMenue::MainMenue(void);
    		static void MainMenue::backgroundWorker1_ProgressChanged( System::Object^ sender, ProgressChangedEventArgs^ e);
    		SpecificationLoader::CWManager^ objWordManager;

    Word est content mais j'ai des effets sur MainMenue:

    	void MainMenue::InitializeProgressBar()
    	{
    		Shown += gcnew EventHandler(  this, &MainMenue::Form1_Shown);
    		// To report progress from the background worker we need to set this property
    		backgroundWorker1->WorkerReportsProgress = true;
    		// This event will be raised when we call ReportProgress
     		backgroundWorker1->ProgressChanged += gcnew ProgressChangedEventHandler( this, &MainMenue::backgroundWorker1_ProgressChanged);
    	}
    
    	void MainMenue::Form1_Shown( System::Object^ sender, System::EventArgs^ e)
    	{
    		// Start the background worker
    		MainMenue::backgroundWorker1->RunWorkerAsync();
    		progressBar1->Visible = false;
    	}
    	
    	// Back on the 'UI' thread so we can update the progress bar
    	void MainMenue::backgroundWorker1_ProgressChanged( System::Object^ sender, ProgressChangedEventArgs^ e)
    	{
    		// The progress percentage is a property of e
    		progressBar1->Value = e->ProgressPercentage;
    	}

    et les messages d'erreur sont:
    1>MainMenue.cpp(163): error C3350: 'System::ComponentModel::ProgressChangedEventHandler' : un constructeur délégué attend 1 argument(s)
    1>MainMenue.cpp(177): error C2227: la partie gauche de '->Value' doit pointer vers un type class/struct/union/générique


    Jean Noël Martin

    jeudi 8 novembre 2012 18:33

Réponses

  • Il ne faut jamais suivre aveuglement des conseils, même venant d'un compilateur.

    Je suis très étonné que votre compilateur indique cela.

    N'utilisez vous pas plutôt des outils d'aide au développement comme ReSharper (http://www.jetbrains.com/resharper/) ???

    Et c'est comme le reste, il faut comprendre le sens de ses remarques.


    C'est peut-être pas très clair avec votre outil, mais sa remarque pour mettre une méthode static, c'est pour vous indiquez que cette méthode n'a aucun code qui utilise les membres d'instance (non static), champs/propriétés/méthodes non statiques, d'un objet de la classe. Il est donc logique que cette méthode soit statique, MAIS vous avez ajouté du code comme "progressBar1->Value ", et sauf erreur de ma part progressBar1 est un membre non static de votre classe.

    Vous devez comprendre les intentions de vos outils avant de les suivre. Et donc dans ce cas précis, avoir un code dans la méthode qui reflète vos intentions.

    Je suis très étonné aussi que vous ayez à éditer ce genre de code, car c'est le genre de code qui doit être automatiquement générer pour de Designer de VS (même en C++/CLI, je viens de tester sur un VS2010 Pro) et donc avec les bons modificateurs pour la déclaration des méthodes (automatiquement créées par le Designer). Si votre outil, dont vous avez mal interpréter ses remarques, est performant, il doit interpréter les sections générés par le Designer et ne pas faire de remarque déplacées sur ce code.

    Il faudrait donc, si progressBar1 est un membre d'instance de la classe, ne pas faire de "backgroundWorker1_ProgressChanged" une méthode statique.

    Et dans ces conditions, votre code devrait "mieux" se compiler.


    Si vous avez vraiment une sémantique de méthode statique, vous ne devez pas indiquer d'objet "porteur" de la méthode, lors de l'enregistrement du delegate sur l'évènement "ProgressChanged" de l'objet backgroundWorker1. Il faut donc utiliser un ProgressChangedEventHandler avec 1 seul paramètre.

    Il faudrait donc utiliser le code suivant (remarquez l'absence, du paramètre à "this" qui n'a aucun sens pour une méthode statique ) :

    "backgroundWorker1->ProgressChanged += gcnew ProgressChangedEventHandler(&MainMenue::backgroundWorker1_ProgressChanged);"


    Donc :

    1 - toujours comprendre la sémantique des messages des outils

    2- toujours utiliser le Designer pour le câblage de l'IHM

    3- comprendre ce qu'est un delegate


    Paul Bacelar, Ex - MVP VC++

    • Marqué comme réponse JeanNoel53 lundi 12 novembre 2012 09:24
    lundi 12 novembre 2012 08:48
    Modérateur