konto usunięte

Temat: Wątki w Javie

Witajcie,
mam pytanko o użycie wątków w Javie. Sytuacja wygląda tak, że z tym językiem mam niewiele wspólnego, a na studiach kazali mi zrobić w tym projekt (-.-).

Tematem projektu jest rozpoznawanie znaków drogowych z wykorzystaniem sieci neuronowych. Moim zadaniem jest wykonanie symulatora samochodu (panel z licznikiem prędkości i panel z wylosowanym znakiem, który jest następnie rozpoznawany przez sieć neuronową). Tutaj problemu nie ma, zrobiłem i działa.

Mój problem polega na tym, że potrzebuję informacji, jak wykonać licznik prędkości (liczba wpisywana do labela "na żywo" w trakcie działania programu).

Powiedzmy, że przyspieszanie to jest u mnie zwiększanie w pętli wartości pola w klasie. Załóżmy, że od 1 do X. Przy próbie wpisania wartości do labela przy każdym przejściu pętli efekt jest taki, że wartość wpisuje się, ale dopiero na samym końcu, kiedy mój "samochód" osiągnie żądaną prędkość, a pętla skończy się "kręcić".

Domyślam się, że trzeba użyć wątków, ale niestety ten temat mnie przerósł i nie mogę sobie z nim poradzić. O tyle, ile w C# jest .start() i join() (i jeszcze invoke) i w zasadzie na tym sprawa się kończy to z mojego punktu widzenia w Javie wątki są bardziej rozbudowane.

Czy ktoś umiałby mi pomóc? :)
Z góry dziękuję i pozdarwiam

konto usunięte

Temat: Wątki w Javie

Rafał Wilmanowicz:
Witajcie,
mam pytanko
Najlepiej jakbyś wkleił kod pętli w której aktualizujesz wartość przyspieszenia, bo problemem może być aktualizacja labela w pętli.
Zgadując, rozumiem że chcesz "widzieć" zmieniającą się wartość prędkości i wyświetlać zaktualizowaną w labelu. Jeżeli tak to możesz użyć metody sleep(x), gdzie x to wartość uśpienia wątku w milisekundach. Da Ci to możliwość zauważenia zmian. Albo użyj klasy Timer.

konto usunięte

Temat: Wątki w Javie

Dzięki za odpowiedź. Tak, dokładnie, chcę podglądać sobie "na żywo" zmianę prędkości w labelu. Pętla zwiększająca prędkość (nie pytaj o warunki, tak musi być wg. założeń:) ). Do jLabel22 wpisze się odpowiednia prędkość, ale dopiero po przejściu całej pętli.



for(int i = 0; i <15; i++) {
if(this.predkosc + 15 <= 260) {
this.predkosc++;

list1.add("\r\n\r\nPRZYSPIESZAM* Aktualna prędkość wynosi: " + this.predkosc +"km/h.");
jLabel22.setText("P"+i);

pauza(2000);
przesun_suwak();

}
}

Temat: Wątki w Javie

1) Co do licznika - prosta inkrementacja może wystarczy, ale jeśli chcesz się wykazać i zrobić coś lepszego, rozważ użycie skali logarytmicznej (w innym czasie przyspieszasz 0-40 a w innym 80-120, prawda?). Podobnie będzie z hamowaniem.
To by wyglądało efektownie na klasycznym, 'analogowym' liczniku, tj. wskazówce i podziałce.

2) Widziałbym ten projekt w wersji wielowątkowej, gdzie prędkościomierz też nie jest przyklejony do danej prędkości, ale ma losowe odchyły o 1-2km/h. W momencie pojawienia się znaku wskazówka zaczyna wędrówkę w kierunku danej prędkości (niejednostajnie)..

Pytanie tylko ile masz czasu przed sesją.

Z ciekawości - mógłbyś mi wysłać na PW więcej informacji o samej sieci i sposobie w jaki rozpoznajesz znaki (analiza obrazu, czy może znaki jako wejścia ilościowe?)?
Ostatnio bawiłem się w SSN, niestety moja sieć miała tylko jeden neuron w warstwie ukrytej i 2 na wyjściu (MLP-3-1-2, hiperboliczne tangensy jako f. aktywacji), toteż nie była zbytnio interesująca..

konto usunięte

Temat: Wątki w Javie

Tak, tak, myślałem nad takim zachowaniem licznika, jednak ze względu na ilość czasu przed sesją postanowiłem zrobić okrojoną, ale działającą wersję, którą zdążę (albo i nie zdążę) ulepszyć.

W zasadzie w nocy wpadłem na dość banalny sposób ominięcia mojego problemu - zrobiłem sobie małego textBoxa, którego sobie updatuję kiedy mi się tylko podoba :)

Marcin, zaraz wyślę PW.
Paweł Grzegorz Kwiatkowski

Paweł Grzegorz Kwiatkowski Architekt
oprogramowania,
Ericsson

Temat: Wątki w Javie

Możesz pomyśleć o wykorzystaniu wzorca Obserwatora. W Javie dostępne jest odpowiednia klasa i interfejs obserwatora:

http://download.oracle.com/javase/1.4.2/docs/api/java/...
http://download.oracle.com/javase/1.4.2/docs/api/java/...

Obiekt klasy, która ma być informowana o zmianach (w Twoim przypadku prędkości) implementuje interfejs Observer, zaś klasa która ma być obserwowalna dziedziczy po Observable bądź posiada atrybut Observable.
Piotr Skoczek

Piotr Skoczek SonarMind, Java
Developer

Temat: Wątki w Javie

Możesz zrobić anonimową klasę wewnętrzna:

new Thread() {

public void run() {
for (int i = 0; i < 10; i++) {
jTextField1.setText("" + i);
try {
TimeUnit.SECONDS.sleep(1);
} catch (InterruptedException ex) {
Thread.currentThread().interrupt();
}
}
}
}.start();



W moim przypadku umieściłem ją w akcji dla przycisku. Problem jaki może się pojawić to po każdym kliknięciu tworzony jest nowy wątek. Jeśli pole ma być modyfikowane przez wiele wątków, lepiej jakbyś skorzystał z puli wątków. PzdrPiotr Skoczek edytował(a) ten post dnia 15.06.11 o godzinie 23:28
Tomasz Cejner

Tomasz Cejner Senior Responsive
Agile Polyglot
Developer

Temat: Wątki w Javie

Modyfikacja elementów UI tworzonego w Swingu musi się odbywać w wątku dispatchera eventów Swinga.
Kod powyżej pewnie zadziała, ale będzie niekoszerny.

Jakikolwiek kod który coś gmera w interfejsie najbezpieczniej
wykonać przez


SwingUtilities.invokeLater(Runnable r);

Następna dyskusja:

Alfabet w Javie




Wyślij zaproszenie do