Wątki a TabPage

0

Witam!
Piszę sobie aplikacje, która ma wykonywać jakieś bliżej nieokreślone czynności na wielu zakładkach.
W formie głównej mam TabControl do którego dynamicznie dodaję zakładki.
Zakładki to moja klasa Sheet, która dziedziczy po TabPage, wyposażona w dodatkowe komponenty.
Chcę aby każda zakładka była osobnym wątkiem, tak aby nie faktycznie można było pracować na kilku z nich, oczywiste... Założenie jest takie, że w każdej zakładce jest BackGroundWorker, który wykonuje jakieś czynności po kliknięciu Start. No i tutaj pojawia się wyjątek: cross-thread operation...
kawałek kodu:

private void addPageToolStripMenuItem_Click(object sender, EventArgs e)
        {
            this.tabControl.Controls.Add(new Sheet(_counter));
        }

dodawanie zakładki

private void backgroundWorker_DoWork(object sender, System.ComponentModel.DoWorkEventArgs e)
        {
            for (int i = 0; i < 1000000; i++)
            {
                this.richTextBox.AppendText("Linia: " + i + '\n');
            }
            this.buttonStart.Enabled = true;
        }

        private void buttonStart_Click(object sender, EventArgs e)
        {
            this.buttonStart.Enabled = false;
            this.backgroundWorker.RunWorkerAsync();
        }

a to już zdarzenia zakładki...

na razie mają jedynie pojawiać się kolejne linie w richtextbox...
Oczywiście zakładki dodają się poprawnie, wyjątek rzucany jest po kliknięciu start...

Proszę pomóżcie, z informacji jakie udało mi się odnaleźć w necie jakoś nie udało mi się dokładnie zrozumieć co i jak należy zrobić aby poprawnie uruchamiać wątki które mają modyfikować elementy GUI...

0

Skoro już używasz BackgroundWorkera, to wykorzystaj zdarzenie ProgressChanged i w nim operuj na kontrolkach.

0

Ehh, ciężki to temat...
Czy może mi ktoś pokazać jak chłopu na granicy jak zrobić takie coś:

Jest forma, w niej tylko np RichTextBox i przycisk,
po kliknięciu odpalają się np 2 wątki które wpisują na zmianę coś do tego richtextboxa ???
Najlepiej jeśli by ktoś był tak miły i nie używał backgroundworkera tylko klasy Thread...

Przykład prosty jak cep ale pozwoli może w końcu trochę rozgryźć ten "magiczny" temat i zrozumieć jak to działa...

0

Był już wątek o czymś podobnym niedawno. Jeżeli chcesz używać wątków do modyfikacji kontrolek stworzonych w innym wątku. (polska polskość)
Musisz użyć invoke + delegacji
(delegacja będzie metoda modyfikującą wartość .Text)
Przykłądowo:

        Thread watek_1;
        Thread watek_2;
        delegate void metoda_do_modyfikacji(string tekst);
        metoda_do_modyfikacji aktualna_metoda_do_modyfikacji;

        //zdarzenie klikniecia uruchamiajace watki
        private void button1_Click(object sender, EventArgs e)
        {
            watek_1 = new Thread(watek_1_setup);
            watek_2 = new Thread(watek_2_setup);
            aktualna_metoda_do_modyfikacji = new metoda_do_modyfikacji(wpisywanie_do_textboxu);
            watek_1.Start();
            watek_2.Start();
        }

        //metoda na ktora wskazuje a_m_d_m
        void wpisywanie_do_textboxu(string tekst)
        {
            textBox1.Text += tekst;
        }

        void watek_1_setup()
        {
            while (true)
            {
                Thread.Sleep(400);
                this.Invoke(aktualna_metoda_do_modyfikacji, "pierwszy wątek, ");
            }
        }

        void watek_2_setup()
        {
            while (true)
            {
                Thread.Sleep(300);
                this.Invoke(aktualna_metoda_do_modyfikacji, "drugi wątek, ");
            }
        }

        //zdarzenie klikniecia, mordujące wątki 
        private void button2_Click(object sender, EventArgs e)
        {
            if (watek_1.IsAlive) watek_1.Abort();
            if (watek_2.IsAlive) watek_2.Abort();
        }

Coś w tym stylu ;-P

0

Uff, pięknie działa !
Jakie wszystko staję proste, łatwe i przyjemne jak tylko ktoś wytłumaczy i powie jak używać ;)
Dzięki za pomoc!!!

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