Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.

0

Form1.cs

public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }
        private void button1_Click(object sender, EventArgs e)
        {
            testowa1 mojaKlasa = new testowa1();
            Thread thr = new Thread(new ParameterizedThreadStart(mojaKlasa.losowanie));
            thr.Start();
            mojaKlasa.losowanie(textBox1);
        }
    } 

testowa1.cs

    class testowa1
    {
        public void losowanie(object mytb)
        {
            var tb = (TextBox)mytb;
            for (int i = 0; i < 10; i++)
            {
                //Thread.Sleep(800);
                tb.AppendText("TEST" + i + "\n");
            }
        }
    }

Przy wywołaniu dostaję błąd przy tb.AppendText("TEST" + i + "\n"); :

Odwołanie do obiektu nie zostało ustawione na wystąpienie obiektu.

Jak to rozwiązać?

1

Ogólnie problem jest w tej części:

Thread thr = new Thread(new ParameterizedThreadStart(mojaKlasa.losowanie));
thr.Start();

Jeśli chcesz to tak robić to do Start() powinieneś przekazać swojego TextBoxa

Ale to nie jedyny problem który napotkasz, Jeśli tak zrobisz, to będziesz modyfikował textboxa z innego wątku. Czy ma to jakieś uzasadnienie, czy tak tylko sobie piszesz?

Polecam jeszcze zerknąć na to, gdybyś chciał, żeby zadziałało do końca: http://msdn.microsoft.com/pl-pl/library/ms171728(v=vs.110).aspx

0

Uzasadnienie chyba tylko takie, że chce program rozbudować do pracy w kilku wątkach, aby kliknięcie w przycisk wykonywało 2,3 operacje jednocześnie, które będą widoczne w textBox podczas ich wykonywania, jednocześnie nie zacinając głównej aplikacji.

0

Dodałem "textBox1" do thr.start(), jak również dodałem invoke dla samego wpisywania do textBox1:

public void losowanie(object mytb)
        {
            var tb = (TextBox)mytb;
            for (int i = 0; i < 100; i++)
            {
                //Thread.Sleep(800);
                tb.Invoke(new Action(delegate()
                {
                    tb.AppendText("TEST" + i + "\n");
                }));
            }
        }

W zasadzie efekt jest taki, że jest to co chce osiągnąć. Tylko czy samo kodowanie w ten sposób jest poprawne?

1 użytkowników online, w tym zalogowanych: 0, gości: 1