Problem z wątkami i tabControl

0

Witam, Mam program który składa się z kilku zakładek... gdy przed uruchomieniem wątku chcę przejść do innej zakłądki, to cały czas wyskakuje mi błąd:

                    tc_zakladki.SelectedIndex = 2;
                    Thread trd2 = new Thread(new ThreadStart(ZnajdzZnaki));
                    trd2.IsBackground = true;
                    trd2.Start();
Object is currently in use elsewhere.

i wskazuje na obiekt który używam w wątku trd2

jak usune linijkę tc_zakladki.SelectedIndex = 2; to program działa poprawnie... nie jestem zaawansowany w tym języku i nie bardzo rozumiem po co to i jak to działa przecieŻ nie ingeruje w zycie obiektu w tym wątku.... (chociasz moge sie myslic), może ktoś wie o co chodzi ?

0

czy w uruchamianych watkach probujesz ustawiac jakies wlasciwosci tc_zakladki?

0

nie, operuje na PictureBox które są w tych panelach

0

tc_zakladki.SelectedIndex = 2; nie powinno mieć wpływu.
A jak modyfikujesz te pictureboxy z drugiego wątku?
Pokaż może tę metodę wątku <ort>w ogóle</ort>.

0

W wątku leci kilka pętelek... pasek postępu przesuwa... gdy w tym wątku na początku zrobie cos takiego

            prog1 = System.Convert.ToInt32(innaKlasa.TexBox1.Text);
            prog2 = System.Convert.ToInt32(innaKlasa.TexBox2.Text);

wszystko działa poprawnie... a gdy zrobie tak (w tym samym wątku gdzie jest kilka pętelek)

            prog1 = System.Convert.ToInt32(innaKlasa.TracBar1.Value);
            prog2 = System.Convert.ToInt32(innaKlasa.TracBar2.Value);

no to mamy błąd... i weś się nie zdenerwuj...

0

czyli dostęp do pól tekstowych jest ok, ale dostęp do suwaka już nie... i o co chodzi ?

0

Musisz to robić Invokiem albo z tego samego watku, w ktorym utworzona zostala forma.

0

ok, tyle to wiem, ale może mi ktoś wytłumaczyć dlaczego tak dzieje się ? I mam jeszcze jedno pytanie, dlaczego ja jestem w jeszcze innej klasie i tam leci sobie wątek, to żeby zmieniać postęp paska postępu z pierwszego okno, mogę np wykoszystać że pasek postępu będzie static i z niego wywołać ProgressBar.Invoke().... ?Chodzi mi o wytłumaczenie jak to działa i dlaczego niektóre kontrolki mają metodę Invoke inne nie... i czy ja sam mogę stworzyć w swojej klasie metode invoke ?

0

Wszystkie kontrolki maja tę metodę 'Invoke', gdyz pochodzi ona z klasy bazowej S.W.F.Control.
Jesli chcesz sie dowiedziec, po co one sa i czemu jak pracujesz z watkami to muisz z nich skorzystac - przeczytaj na MSDN o CrossThreadException

nie, pasek postepu nie powinien byc static.

tak, mozesz stworzyc sobie w klasie metode Invoke, ale raczej nie chcesz tego robic.. Zacznij od poczytania o w/w wyjatku, zrozumienia czemu w WinForms wprowadzono taki mechanizm ochronny i najprawdopodobniej wtedy bedziesz juz wiedzial wszystko o co miales tutaj zapytac:)

0

ok dzieki zabieram się za czytanie :)

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