Gui aus anderem Thread ändern?



  • Hallo!

    Folgendes Problem: Ich habe mein Hauptthread in dem ich Datentabellen initialisiert habe. Nun möchte ich mit einem Backgroundworker in einem neuen Thrad Daten einlesen via Ethernet und dann die Ergebnisse in die Datentabellen eintragen. Bis auf das aktualisieren der Datentabellen läuft alles. Nun habe ich meinen Code soweit abgespeckt, dass nur ein String übergeben wird und dieser in einem Testfeld aktualisiert wird. Aber auch das läuft nicht. Ich habe schon einige Beispiele gelesen doch komme ich nicht darauf, was ich falsch mache.
    Außerdem verstehe ich die entstandene Fehlermeldung nicht! Vielleicht kann mir ja jemand helfen

    Hauptthread: Form1.h

    public: void UpdateDatenTabellen(String^ ks);
    

    Form1.cpp

    void Form1::UpdateDatenTabellen(String^ ks)
    {
    	MessageBox::Show("DFR");
    	button1->Enabled = true;
           this->textBox1->Text = ks;
           this->textBox1->Update();
    }
    

    Nebenthread.h

    public: delegate void UpdateDatenTabellenMethode(String^ ks);
    

    Nebenthread.cpp

    void Progressbar::backgroundWorker1_DoWork( Object^ sender, DoWorkEventArgs^ e )
    {
        String^ lsd = "Wer hat";
        array<Object^>^ dele = {lsd};
        UpdateDatenTabellenMethode^ neuUpdate = gcnew   UpdateDatenTabellenMethode(this, &Form1::UpdateDatenTabellen);
        this->Invoke(neuUpdate, dele);
    }
    

    Folgende Fehlermeldung erscheint:
    error C2440: 'Initialisierung': 'XML_Testobjekt::Progressbar ^const ' kann nicht in 'XML_Testobjekt::Form1 ^' konvertiert werden
    Es ist kein benutzerdefinierter Konvertierungsoperator verfügbar, oder
    Die Typen, auf die verwiesen wird, sind nicht verknüpft; die Konvertierung erfordert einen reinterpret_cast-Operator oder eine Typumwandlung im C- oder Funktionsformat.
    .\Progressbar.cpp(42) : error C3754: Delegatkonstruktor: Die Memberfunktion "XML_Testobjekt::Form1::UpdateDatenTabellen" kann nicht für eine Instanz vom Typ "XML_Testobjekt::Progressbar ^const " aufgerufen werden.
    CXML_auswerten.cpp

    Wenn ich eine Neue Instance von Form1 im Nebenthread erzeuge und diese anstelle von this einsetzte,

    Form1^ fr = gcnew Form1();
    ...
    UpdateDatenTabellenMethode^ neuUpdate = gcnew UpdateDatenTabellenMethode(fr, &Form1::UpdateDatenTabellen);
    

    generriert der Compiler ohne Fehler und die Messagebox wird angezeigt, doch er aktuallisiert die Objekte nicht ?



  • Du musst schon das korrekte Form1 Objekt übergeben.
    Ev. ist das sogar über Parent erreichbar.

    Ansonsten musst Du z.B. eine Referenz auf das entsprechende Form1 Objekt übergeben.

    Simon



  • Danke mal wieder für den Denkanstoß!!! 👍 👍
    Für alle die das gleiche Problem haben hier noch mal der funktionierende QuellCode:

    Form1.h

    public: void UpdateDatenTabellenMethode(String^ ks);
    delegate void UpdateDatenTabellen(String^ ks);	
    UpdateDatenTabellen^ mydelegate;
    this->Name = L"Form1";
    this->Text = L"Form1";
    //Wichtig um neuen Thread auszuführen
    this->mydelegate = gcnew UpdateDatenTabellen(this, &Form1::UpdateDatenTabellenMethode);
    this->Load += gcnew System::EventHandler(this, &Form1::Form1_Load);
    

    Aufruf Form1.cpp

    //Neue Instance erzeugen
    Progressbar^porcess = gcnew Progressbar(this);
    porcess->Show();
    
    void Form1::UpdateDatenTabellenMethode(String^ ks)
    {
     this->button1->Enabled = true;
     this->textBox1->Text = ks;
    }
    

    Nebenthread.h

    private: Form1^ form1;
    Progressbar(Form1 ^fr )
    {
     InitializeComponent();
     InitializeBackgoundWorker();
     //Referenz zum Form1 herstellen
     this->form1 = fr;
    }
    

    Nebenthread.cpp

    void Progressbar::backgroundWorker1_RunWorkerCompleted( Object^ /*sender*/, RunWorkerCompletedEventArgs^ e )
    {
     String^ lsd = "Wer hat";	
     array<Object^>^ dele = {lsd};
     form1->Invoke(form1->mydelegate, dele);
    }
    

Anmelden zum Antworten