Methodinvoker



  • Hallo, ich zweifel gerade wieder an mir selbst. Ich habe einen Thread in dem ich Werte von einem Sensor auslese. Ich möchte mittels Invoke die ermittelten Werte in die Gui übertragen in dem ich der Methode eine Liste übergebe jedoch bekomme ich immer einen Fehler beim Kompilieren.

    Fehler 1 error C3352: "void MainWindow::DrawInGui(System::Object ^)": Die angegebene Funktion stimmt nicht mit dem Delegattyp "void (void)" überein.

    Aber MethodInvoker nimmt doch als Parameter System Objekt^, System::Intptr
    was mach ich denn Falsch?

    private: System::Void DrawInGui(Object^ o)
    {
       List <unsigned long>^ list = (List<unsigned long>)o;
      //trage Werte ein
    }
    
    SingleMeasurement(Object^ o)
    {
        //Hier ist der Thread
        List<unsigned long>^ values = gcnew List<unsigned long>();
        //ermittel die Werte und trage ein
         MethodInvoker^ mi = gcnew MethodInvoker(this,&MainWindow::DrawInGui);
    
        this->Invoke(mi, values); 
    }
    


  • http://msdn.microsoft.com/en-us/library/system.windows.forms.methodinvoker.aspx

    Du musst einen eigenen Delegaten erstellen. MethodInvoker hat die Signatur void f() - das passt nicht mit void DrawInGui(object) zusammen.

    Simon



  • Represents a delegate that can execute any method in managed code that is declared void and takes no parameters.

    Jetzt bin ich ein wenig verwirrt, wie kann ich denn da meiner Methode in diesem Fall die Liste übergeben? 😮



  • Hier ist ein Bsp.

    typedef List<unsigned long> Values;
    
    delegate void NewValues(Values^ values);
    
    void DrawInGui(Values^ values)
    {
    	// hier dein gui code...
    	// dieser code läuft auf dem gui thread und das muss er auch...
    }
    
    void SingleMeasurement()
    {
    	// dieser code läuft nicht auf dem gui thread...
    	// gui anfassen verboten...
    
    	Values^ values = gcnew Values();
    	// messung durchführen, werte speichern
    
    	NewValues^ newValues = gcnew NewValues(this, &Form1::DrawInGui);
    	this->Invoke(newValues, values);
    }
    


  • Besten Dank nun funktioniert die ganze Geschichte so wie man sich das vorstellt 🙂


Log in to reply