Thread Zugriff auf UI



  • Hallo,

    ich habe folgendes Problem:
    Ich habe eine Anwendung die aus einer Form und einem parallel dazu laufenden Thread besteht. Nun möchte ich aus dem Thread auf die Form zugreifen, und z.B. ein Label ändern. Wie kann ich das Thread-sicher tun?

    danke,
    uzzman



  • InvokRequired
    Invoke
    BeginInvoke



  • danke erstmal!
    Ich taste mich allerdings erst an dieses Thema heran! Könntest du mir bitte ein Code Beipiel geben?

    Thx,
    uzzman



  • Mit InvokeRequired bekommst Du raus, ob Du aus einem anderen Thread zugreifst. Mit Invoke startest Du die Verarbeitung Syncron im GUI Thread, mit BeginInvoke Asyncron.

    Nehmen wir an, wir haben eine Methode void doIt(string txt); die Textbox1 ändern soll. Das könnte dann so ausschauen:

    delegate void VoidStringDelegat(string txt);
    void doIt(string txt)
    {
       if(InvokeRequired)
       {
          Invoke(new VoidStringDelegat(doIt),txt);
          return;
       }
    
       Textbox1.Text = txt;
    

    Wenn Du BeinInvoke verwendest, wartet der Thread der die Methode aufruft nicht darauf das doIt beendet wird. Ich hab den C++/CLI Code nicht im Kopf, wenn Du Probleme hast den C# Code umzusetzen meld dich noch mal, dann pack ich mal den C++/CLI Compiler raus um ein Beispiel zusammen zu setzen.



  • Ich habe den Code jetzt mal eingefügt:

    public:
    		delegate System::Void VoidStringDelegat(System::String^ txt);  
    		System::Void changeText(System::String^ str)
    			{
    				if(InvokeRequired)
    				{
    					Invoke(gcnew VoidStringDelegat(&TestForm::Form1::changeText), str);
    						return;
    				}
    
    				textBox1->AppendText("Hallo");
    			}
    

    Beim Kompilieren bekomme ich aber den folgenden Fehler:
    error C3352: 'void TestForm::Form1::changeText(System::String ^)' : the specified function does not match the delegate type 'void (System::String ^)'

    😞



  • Ich bin ein wenig aus der Übung mit Delegaten und C++, aber Du kannst die Instanzmethode nicht über die Klasse ansprechen. Prüfe mal ob der Deletag im Konstruktor nicht 2 Parameter erwartet, die Funktion und das Objekt für den diese aufgerufen wird.

    gcnew delegat(this,&Klasse::Methode);
    

Anmelden zum Antworten