Watki a komponenty

0

mam wątek animujacy cos tam
chcialbym pobrac wartosc trackbara wewnatrz tego watku
np tak

Thread.Sleep(trackBar2.Value);

ale nie mam dostepu z watku do komponentow utworzonych poza tym watkiem
jak to pobrac ???

0

Musisz uzyc Invoke.

pozdrawiam
johny

0

tak tez myslalem
tylko za bardzo nie wiem o co biega z tym delegate method itp
jak to ma wygladac co to za parametry ...

0

Przyklad z palca, wiec moga byc drobne bledy:

wszystko w formatce gdzie jest TrackBar


delegate String getValue();

private String getTrackBarValue()
{
  return trackbar.Value;
}

public String getTrackBarValueSafe()
{
  return (String) Invoke(new getValue(getTrackBarValue));
}

i w watku of coz wywolujesz getTrackBarValueSafe()

pozdrawiam
johny

0

Dzieki wielki
śmiga
oprocz tego ze to int to bledow nie bylo

0

mam jeszcze jedno pytanko
animowane elementy to bitmaby albo image
jesli animacja danego elementu jest akurat włączona w wątku to niestety mam do niej ograniczony dostęp tzn.
bywa tak ze dostaje błąd "obiekt jest używany gdzie indziej"

0
Prim0 napisał(a)

mam jeszcze jedno pytanko
animowane elementy to bitmaby albo image
jesli animacja danego elementu jest akurat włączona w wątku to niestety mam do niej ograniczony dostęp tzn.
bywa tak ze dostaje błąd "obiekt jest używany gdzie indziej"

Mozesz podac przyklad? Bo nie za bardzo kumam o co chodzi. A z intem rzeczywiscie, nie zauwazylem :P

pozdrawiam
johny

0
grafikaE2.FillRectangle(drawW, 1, 1, Pole.grafa[i, j].Width * 4, Pole.grafa[i, j].Height * 4);

np ta linijka jest wewnątrz wątku
i na niej zatrzymuje sie debuger z bledem Obiekt jest uzywana gdzie indziej
mysle ze konkretnie chodzi o Pole.grafa[i, j].Width
niekiedy debuger wywali jakies inne rysowanie poza watkiem z tym samym komunikatem
czasami czepi sie o jakis parametr width height
ale bywa tez ze o np Setpixel

nie pozwala edytowac bmpa ktory akurat sie przewija

0

ok mam
tam gdzie wywoływałem bitmape dalem

lock(bitmapa){wywołanie bitmapy}

i dziala

0

A widzisz - na to bym nie wpadl, ze zwykla synchronizacja wystarczy, a w sumie takie oczywiste... :)

pozdrawiam
johny

0

Mimo wszystko cos mi sie kaszani z tymi watkami
wyglada to tak
mam 2 watki watekA i watekB
watek a leci na jedna procedure animujA a watekB na druga animujB
procedurki animujA i animujB animuja obiekt ale obiektow moze byc sporo tablica [16,32]

i teraz tak


if (comboBox_ET.SelectedItem == null || comboBox_ET.SelectedItem.ToString() == "Brak")
            {
                Pole.anim[Pole.wi, Pole.wj] = 1;
                niesk[Pole.wi, Pole.wj] = 10; // to opuszcza petle w procedurce animacji
                //if (watekA.IsAlive) { watekA.Abort(); }
                //if (watekA.IsAlive) { watekA.Abort(); }
            }
            if (comboBox_ET.SelectedItem == null || comboBox_ET.SelectedItem.ToString() == "Wjazd z lewej")
            {
                
                Pole.anim[Pole.wi, Pole.wj] = 2;
                if (watekA.IsAlive) { watekA.Join(); } else { watekA.Start(); }
               
            }
            if (comboBox_ET.SelectedItem == null || comboBox_ET.SelectedItem.ToString() == "Wjazd z prawej")
            {

                Pole.anim[Pole.wi, Pole.wj] = 3;
                if (watekB.IsAlive) { watekB.Join(); } else { watekB.Start(); }
             
            }

problem polega na tym ze w momencie kiedy kilka obiektow korzysta z jednego watku np watekA i pozniej wylaczam animacja (czyli pierwszy if w powyzszym kodzie) dla jednego z tych obiektow to pozostale jakos dziwnie skacza

0

OK ZNALAZLEM BLAD
po odswierzeniu kazdego elementu bylo niepotrzebne wejscie w animacje pomimo iz juz się animowal

if (comboBox_ET.SelectedItem == Null || comboBox_ET.SelectedItem.ToString() == "Brak")
            {
                Pole.anim[Pole.wi, Pole.wj] = 1;
                niesk[Pole.wi, Pole.wj] = 10; // to opuszcza petle w procedurce animacji
                //if (watekA.IsAlive) { watekA.Abort(); }
                //if (watekA.IsAlive) { watekA.Abort(); }
            }
            if (comboBox_ET.SelectedItem == Null|| comboBox_ET.SelectedItem.ToString() == "Wjazd z lewej")
            {
                if (Pole.anim[Pole.wi, Pole.wj] != 2)
                {  
                Pole.anim[Pole.wi, Pole.wj] = 2;
                if (watekA.IsAlive) { watekA.Join(); } else { watekA.Start(); }
               }
            }
            if (comboBox_ET.SelectedItem == Null || comboBox_ET.SelectedItem.ToString() == "Wjazd z prawej")
            {
        if (Pole.anim[Pole.wi, Pole.wj] != 3)
                {
                Pole.anim[Pole.wi, Pole.wj] = 3;
                if (watekB.IsAlive) { watekB.Join(); } else { watekB.Start(); }
             }
            }
0

jeszcze jedno johny
jesli zamykam programik a watki nie chodza to jest ok
w momencie kiedy watek chodzi a ja zamylam ta forme to wysypuje sie na

private String getTrackBarValue()
{
  return trackbar.Value;
}

public String getTrackBarValueSafe()
{
  return (String) Invoke(new getValue(getTrackBarValue));
}
0

Tak, bo formatka niszczy wszystkie swoje obiekty i zwalnia pamiec. A watki staraja sie do niej dobic. W takim razie albo koncz wszystkie watki zanim zamkniesz formatke albo w samym watku sprawdzaj czy formatka jeszcze istnieje. Jak nie to niech sie watek konczy.

pozdrawiam
johny

0

spoko chyba stestuje sposob z watkiem
bo probowalem zakanczac watki w zdarzeniu formclosing ale nic to nie zmienilo

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