Swing, grafika + wątki

0

Po długiej przerwie znów potrzebuję Waszej pomocy... tym razem jest to Java. Nie chcę wrzucać kodu całego programu bo zajmuje ponad 400 wierszy dlatego wrzucą tylko jedną funkcję która zdaje się powodować "mulenie". Mianowicie robię symulator linii produkcyjnej są pojemniki na taśmie, tasma sie przesuwa i do kolejnych pojemników nalewana jest ciecz z zbiornika znajdującego się wyżej. W zbiorniczku wyżej jest jeszcze mieszadełko którego ruch symuluję poprzez zmniejszanie i zwiększanie szerokości dwóch elips leżących przy sobie (daje to wrażenie obracania się śmigła mieszadła). Zrobiłem kilka wątków jeden jest odpowiedzialny za przesuwanie pojemnikow na tasmie drugi za nalewanie cieczy i teraz chciałem dorobic watek odpowiedzialny za mieszanie jednak po dodaniu tej funkcji i wywołaniu jej kilkukrotnie w pętli wszystko zaczyna mulić... na ubuntu jeszcze w miarę ale na Viscie to totalna porażka.

Powiedzcie co robię źlę... z Javą dopiero zaczynam może źle robię wątki albo nie potrzebnie je tworzę? Poniżej funkcja obrotu mieszadła:

    public void rotate(){        
        t = new Thread(){

            @SuppressWarnings({"static-access", "empty-statement"})
            @Override
            public void run(){
                while(semafor == false);
                semafor = false;
                for(int i = 0; i < 20 ; i++){
                    decWidth();
                    try {
                        sleep(25);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(Mieszadelko.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                for(int i = 0; i < 20 ; i++){
                    incWidth();
                    try {
                        sleep(25);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(Mieszadelko.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                semafor = true;

            }
        };
        t.start();
    }

Dodam jeszcze że dla pozostałych wątków tworzyłem klasy nazwane (nie anonimowe). Wątki tworze po to żeby zrobić efekt animacji... nie wiem czy dobrze się za to zabrałem.

0

jestes pewny ze chcesz miec petle ktora nic nie robi i tylo czeka az semafor != false?

...
while(semafor == false);
...

jesli tak to zmien chociaz na

...
while(semafor == false) 
    Thread.sleep(1) ;
...
0

właściwie o też o tym myślałem... jutro dokładniej sprawdze jak to będzie działać na Viscie bo na Ubunctu różnicy chyba nie widać... ale idzie w miarę płynnie...

0

Można to zrobić na co najmniej 10 sposobów - Ty wybrałeś najgorszy.

Jednym z najprostszych rozwiązań jest użycie bloku synchronized

            public void run(){
                synchronized(Mieszadelko.class){
                for(int i = 0; i < 20 ; i++){
                    decWidth();
                    try {
                        sleep(25);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(Mieszadelko.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
                for(int i = 0; i < 20 ; i++){
                    incWidth();
                    try {
                        sleep(25);
                    } catch (InterruptedException ex) {
                        Logger.getLogger(Mieszadelko.class.getName()).log(Level.SEVERE, null, ex);
                    }
                }
               }

            }
0

rzeczywiście instrukcja while strasznie muliła, po zastosowaniu synchronized aplikacja działa o niebo lepiej:)dzięki za pomoc:)

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