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 ???
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 ???
Musisz uzyc Invoke.
pozdrawiam
johny
tak tez myslalem
tylko za bardzo nie wiem o co biega z tym delegate method itp
jak to ma wygladac co to za parametry ...
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
Dzieki wielki
śmiga
oprocz tego ze to int to bledow nie bylo
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"
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
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
ok mam
tam gdzie wywoływałem bitmape dalem
lock(bitmapa){wywołanie bitmapy}
i dziala
A widzisz - na to bym nie wpadl, ze zwykla synchronizacja wystarczy, a w sumie takie oczywiste... :)
pozdrawiam
johny
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
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(); }
}
}
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));
}
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
spoko chyba stestuje sposob z watkiem
bo probowalem zakanczac watki w zdarzeniu formclosing ale nic to nie zmienilo