Problem z komunikacją między wątkami

0

napisałem program z dwoma oknami. W tym dodatkowym okienku mam kilka zmiennych. Do ich modyfikacji napisałem metodę. Problem polega na tym, że czasem (ale nie zawsze) wywołanie tej metody powoduje błąd
http://img189.imageshack.us/i/przechwytywanierf.png/
w linii, gdzie zmieniam wartości.

Doczytałem, że jest to błąd w komunikacji między wątkami. Tzn, że otworzenie okna jest w innym wątku niż, w którym zostało ono utworzone.

Jak mógłbym łatwo to rozwiązać? Dodam tylko, że w programie żadnych wątków ja nie używam, czyli pewnie cis mi takiego psikusa robi :)

Próbowałem napisać tak zwanego delegata. Do klasy okna wywoływanej dopisałem metodę:

        delegate void setPoziomyValueCallback(int nr_poziomu, int poziom);
        void setPoziomyValue(int i, int poziom)
        {
            Poziomy[i].Value = poziom;
        }

i w metodzie, która ma zmieniać wartości w tym oknie napisałem:

if (this.InvokeRequired)
            {
                setPoziomyValueCallback poz = new setPoziomyValueCallback(setPoziomyValue);
                this.Invoke(poz, new object[] { i, System.Convert.ToInt32(snr)});
else
            {
                int nr_snr;
                try
                {
                    nr_snr = System.Convert.ToInt32(snr);
                }
                catch { nr_snr = 0; }

                Poziomy[i].Value = nr_snr;
            }

jednak nadal dostaję błąd.

Jak mógłbym to ugryźć?

0

z tego co się orientuję każde okno tworzone jest w oddzielnym wątku dlatego też jeżeli chcesz odwołać się do zmiennych istniejących w wątku innym niż aktualny musisz zrobić invoke. Ja to robiłem zawsze tak :

public static void setPoziomyValueCallback(int nr_poziomu, int poziom)
        {
            object []tab = {nr_poziom, poziom};
            if (this.InvokeRequired)
                this.Invoke(new Action<int, int>( setPoziomyValueCallback), tab);
            else
                Poziomy[nr_poziomu].Value = poziom
        }

nie gwarantuje Ci, że to zadziała ponieważ nigdy nie robiłem tego z dwoma argumentami w metodzie.

0

dzięki za odp. Na razie wygląda, że jest ok.

ciekawi mnie jedna kwestia: dlaczego na moim komputerze nie pojawiał się ten błąd, natomiast na komputerze kolegi za każdym razem, gdy tylko uruchomił program.
Czy to jest zależne od np dostępnych zasobów systemowych?

0

Tak, kolega może mieć szybszy/wolniejszy komputer i dany wątek może wykonać się szybciej/wolniej i "wskoczyć" tam gdzie u Ciebie się nie zdarzało :)

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