Guizugriff aus Thread



  • Hallo, ich habe einen Thread der Daten ausliest. Und mittels this->Invoke werden die Daten in die Gui gezeichnet. Ich habe eiene eigene Klasse geschrieben (MyData), mit der ich die Daten zusammen fasse. Und wenn ich den folgenden Code aufrufe bekomme ich zur Laufzeit den Fehler:

    Das Objekt mit dem Typ "MyData" kann nicht in den Typ "System.Collections.Generic.List`1[MyData]" konvertiert werden.

    Hier sind meine Deklarationen

    private: delegate void DrawValues(List<MyData^>^ liste_s);
    private: System::Void DrawInGui(List<MyData^>^ liste_s);
    

    Hier die Stelle, an der zur Laufzeit der Fehler auftritt.

    {
    DrawValues^ delegateDraw = gcnew DrawValues(this, &Test_Main::DrawInGui);
    
    //bearbeite die Aufgabe dann zeichne
    
    array<Object^>^ delegateList = {mydata};
    this->Invoke(delegateDraw, delegateList);
    }
    

    Aber mit folgendem Code funktioniert das ganze einwandfrei. Jedoch finde ich das nicht gerade elegant über den Umweg eine Liste anzulegen. Vielleicht könnt ihr mir ja weiter helfen, ob es einfacher geht.

    //bearbeite die Aufgabe dann zeichne
    
    List<MyData^>^ temp_liste = gcnew List<MyData^>();
    temp_liste->Add(mydata);
    
    array<Object^>^ delegateList = {temp_liste};
    this->Invoke(delegateDraw, delegateList);
    

    Mfg Christian



  • Warum willst Du keine Liste anlegen?

    Du hast ja in der Signatur eine List<..> vorgegeben. Dann musst Du natürlich auch eine Liste übergeben.

    Oder Du kannst die Signatur von DrawInGui(..) abändern (am besten in z.B. IEnumerable<..>).

    Simon



  • Hi vielen Dank für deine Antwort, eigentlich habe ich ja nur die Liste erzeugt, da ja Invoke ein Array erwartet.

    virtual Object^ Invoke(
        Delegate^ method, 
        array<Object^>^ args
    )
    

    und wenn ich wie im folgendem Beispiel die Instanz mydata übergebe tritt ja der Fehler auf.

    array<Object^>^ delegateList = {mydata};
    this->Invoke(delegateDraw, delegateList);
    

    Die Liste ist daraus entstanden, als ich das Problem beseitigen wollte 😃
    Ich habe das Gefühl, dass ich hier nur gebastelt habe. Denn das eine Objekt
    in eine Liste zu packen, welche dann in ein array vom Typ Objekt gecastet wird
    finde ich nicht so schön. Anfangs hatte ich den folgenden Code implementiert.
    Und diese beinhaltet unterschiedliche Listen. Ist es denn so realisierbar.

    private: delegate void DrawValues(MyData^ m);
    private: System::Void DrawInGui(MyData^ m);
    

    Kann ich denn etwa auch das Objekt mydata übergeben ohne ein Array zu erzeugen?

    this->Invoke(delegateDraw, mydata);
    

    Christian



  • Kann ich denn etwa auch das Objekt mydata übergeben ohne ein Array zu erzeugen?

    Nein, siehe:
    http://msdn.microsoft.com/en-us/library/system.windows.forms.control.invoke.aspx

    Erzeuge also bei Invoke ein Array, gefüllt mit deinen Parametern (bei Dir ein MyData Objekt). Die Signatur des Empfänger ist dann nur mit einem MyData Objekt.

    Simon



  • private: delegate void DrawValues(MyData^ m);
    private: System::Void DrawInGui(MyData^ m);
    

    Ahh ok, also sollte das wie folgt funktionieren wenn ich dich jetzt richtig verstanden habe. Und der Fehler lag bei

    DrawValues(List<MyData^>^ liste)
    

    an der Liste. So dass zur Laufzeit erst der Fehler kam.

    private: delegate void DrawValues(MyData^ m);
    private: System::Void DrawInGui(MyData^ m);
    
    Thread(...)
    {
    DrawValues^ delegateDraw = gcnew DrawValues(this, &Test_Main::DrawInGui);
    
    //bearbeite die Aufgabe dann zeichne
    
    array<Object^>^ delegateList = {mydata};
    this->Invoke(delegateDraw, delegateList);
    }
    

    Wenn ja werde ich morgen früh das ganze gleich mal ausprobieren 😃
    Christian



  • Ja, genau, jetzt siehts gut aus.
    Simon



  • Wenn Du im Thread keinen Rückgabewert brauchst und nichts synchronisieren musst, dann Rate ich Dir zu "BeginInvoke"...


Anmelden zum Antworten