C # Threads - проблема с родительским доступом - PullRequest
1 голос
/ 21 августа 2009

Моя цель состоит в том, чтобы в функции "Пустышка" я мог изменить элементы управления, такие как метки и т. Д. Формы, из которой инициируется поток .. как это сделать .. Пожалуйста, не предлагайте совершенно разные стратегии или не работайте класс и т.д. ... измените это, если можете

        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();
        }


    }
}

я планирую сделать это в функции "Пустышка"

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

Ответы [ 3 ]

4 голосов
/ 21 августа 2009

Вы можете сделать это, предположив, что вы передаете экземпляр формы методу thread, используя метод t.Start(...):

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
Для ясности добавлен стартовый код потока.

3 голосов
/ 21 августа 2009

Вы не можете сделать это. Вы можете получить доступ к элементу управления пользовательского интерфейса только в том же потоке, который его создал.

См. Метод System.Windows.Forms.Control.Invoke и свойство Control.InvokeRequired.

2 голосов
/ 21 августа 2009

Можно использовать что-то вроде этого:

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");
}
...