2009-08-21 6 views
1

Mein Ziel ist es, dass in der Funktion "Dummy" ich die Steuerelemente wie Etiketten usw. der Form ändern kann, von dem der Thread initiiert..wie es zu tun ist .. bitte nicht komplett vorschlagen verschiedene Strategien oder einen Arbeiter Klasse usw. machen ... ändern Sie dies, wenn Sie könnenC# Threads - Eltern Zugang Problem

 Thread pt= new Thread(new ParameterizedThreadStart(Dummy2)); 


     private void button1_Click(object sender, EventArgs e) 
     {      
      pt = new Thread(new ParameterizedThreadStart(Dummy2)); 
      pt.IsBackground = true; 
      pt.Start(this); 
     } 


     public static void Dummy(........) 
     { 
      /*     
      what i want to do here is to access the controls on my form form where the 
      tread was initiated and change them directly 
      */ 
     } 

     private void button2_Click(object sender, EventArgs e) 
     { 
      if (t.IsAlive) 
       label1.Text = "Running"; 
      else 
       label1.Text = "Dead"; 
     } 

     private void button3_Click(object sender, EventArgs e) 
     { 
      pt.Abort(); 
     } 


    } 
} 

was ich plane, ist, dass ich dies tun könnte in der „Dummy“ Funktion

Dummy(object p) 
{ 
    p.label1.Text = " New Text " ; 
} 

Antwort

4

Sie dies tun könnte, vorausgesetzt, sind Sie eine Instanz des Formulars auf der Fadenmethode Führen des t.Start(...) Methode:

private void Form_Shown(object sender) 
{ 
    Thread t = new Thread(new ParameterizedThreadStart(Dummy)); 
    t.Start(this); 
} 

.... 


private static void Dummy(object state) 
{ 
    MyForm f = (MyForm)state; 

    f.Invoke((MethodInvoker)delegate() 
    { 
     f.label1.Text = " New Text "; 
    }); 
} 

EDIT
Thread-Startcode für Klarheit hinzugefügt.

+0

jetzt, wenn ich das tun möchte, dass dieser Thread tut, was es tun soll und nach jedem "X" Sekunden weckt es immer wieder – Moon

+0

wie viel Speicher dieser "Invoke" wird nehmen, sagen wir, wenn das Elternformular hat viele UI-Controls n alle – Moon

+0

Für den ersten Kommentar: Timer zum Formular hinzufügen. Feuert alle X Sekunden ab, wenn der Thread noch nicht aktiv ist und einen neuen Thread erstellt (Threads können nicht wiederverwendet werden) ODER Schleife in der Thread-Methode und nach dem, was Sie tun müssen: Schlaf für X Sekunden (Sie müssen den Thread vorher beenden Schließen Sie das Formular !!) –

3

Sie können nicht tun Dies. Sie können nur auf ein UI-Steuerelement für denselben Thread zugreifen, der es erstellt hat.

Siehe die System.Windows.Forms.Control.Invoke Method und die Control.InvokeRequired Eigenschaft.

+0

Können Sie mir ein Beispiel geben, wie Sie auf ein UI-Steuerelement von einem anderen Thread zugreifen, der "es nicht erstellt hat" – Moon

+1

Können Sie auf die von mir bereitgestellten Links klicken? –

2

Kann so etwas wie folgt verwenden:

private void UpdateText(string text) 
{ 
    // Check for cross thread violation, and deal with it if necessary 
    if (InvokeRequired) 
    { 
     Invoke(new Action<string>(UpdateText), new[] {text}); 
     return; 
    } 

    // What the update of the UI 
    label.Text = text; 
} 

public static void Dummy(........) 
{ 
    UpdateText("New text"); 
} 
+0

Wen rufen Sie Invoke und InvokeRequired hier an? – Marc

+0

Das Formular mit dem Label. – Svish