aus methode auf label schreiben
-
Hola,
ganz dumme frage.
Ich habe eine time() Methode in der Form1() klasse und will jetzt auf label->text schreiben, welches auf Form1 liegt.Probiert habe ich this->label->text aber das Funktioniert nicht, wobei auch kein Fehler kommt.
Wie mach ich das richtig?
-
welcher fehler kommt denn?
-
Da liegt ja mein Problem, es kommt kein Fehler.
public ref class Form1 : public System::Windows::Forms::Form { public: System::Threading::ThreadStart ^ts; //element tread_start System::Threading::Thread ^tr; delegate void MyDelegate(String ^s); //delegaten Form1(void) { InitializeComponent(); // //TODO: Konstruktorcode hier hinzufügen. // ts = gcnew System::Threading::ThreadStart(this,&Form1::timer); //definiere thread_start } . . . . private: System::Void button1_Click(System::Object^ sender, System::EventArgs^ e) { if(tr != nullptr){ //prüfen ob thread läuft tr->Abort(); tr = nullptr; //auf null setzten } tr = gcnew System::Threading::Thread(ts); //neu def. tr->IsBackground = true; tr->Start(); } private: System::Void button2_Click(System::Object^ sender, System::EventArgs^ e) { Close(); } public: void writeLab(String ^s1){ //im debugger sehe ich das variable s1 = blabla ist //beide zuweisungen funktionieren nicht this->label1->Text = "asdasdasd"; //this->label1->Text = s1; } void timer(){ try{ if(this->label1->InvokeRequired){ Form1 ^MyF = gcnew Form1(); MyDelegate ^dg1 = gcnew MyDelegate(MyF,&Form1::writeLab); dg1->Invoke("blabla"); }else{ this->label1->Text = "thread alive"; } }catch(System::Threading::ThreadAbortException ^){ }finally{} } }; }
-
Warum legst Du denn einen neue Instanz der Form an??????
Der Text wird wunderbar gesetzt, nur eben in der neuen Instanz...
Du solltest keine neue Form anlegen, sondern einfach "this" übergeben...this->BeginInvoke(gcnew MyDelegate(this,&Form1::writeLab));
-
PS: Und ich würde "BeginInvoke" verwenden, wenn Du nicht warten willst, bis der Label gesetzt ist; und auch kein Rückgabewert willst...
-
Mit der Instanz hab ich so gelesen und übernommen.
Danke für den Tipp, aber jetzt bekomme ich eine InvalidOperationException und meine Methode schreibt trotz alledem nicht ins label!?
-
Nimm doch den Timer aus System::Windows::Forms.
Da brauchst Du die Synchronisation nicht.
Simon
-
Ich wollt das Problem aber erst einmal lösen.
Wiso schmeißt mir this->label1->Text die InvalidOperationException.
Könnte mir das bitte noch jemand sagen?Ich dachte die Methode wäre der gleiche thread wie Form1()!
Wieso kann die Methode nicht auf das UI thread zugreifen?
-
Weil Du Invoke auf dem Delegaten aufrufst.
Du sollst aber Invoke auf dem Control aufrufen (z.B. deiner Form).Simon
-
Ich danke dir vielmals! Problem erledigt! Verwirrung beseitigt!