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.aspxErzeuge 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"...