Autor Wątek: Java - wątki i pętla gry  (Przeczytany 2838 razy)

Offline programistagd

  • Użytkownik
    • WeHaveIdea

# Czerwiec 09, 2010, 22:14:14
Witam!
Mam pewien problem.
Gdy uruchamiam swoją grę po zalogowanie przestaje ona działać.
Mój kod(fragmenty):
Funkcja run:
public void run()
{

Thread.currentThread().setPriority(Thread.MIN_PRIORITY);

while (true)
{
try
{
update(getGraphics());

Thread.sleep(speed);
}
catch (InterruptedException ex)
{
System.out.println("InterruptedException at run: "+ex.getMessage());
}


Thread.currentThread().setPriority(Thread.MAX_PRIORITY);
}

}
Update:
public void update (Graphics g)
{
if(tm>=10){step();tm=0;}
else{tm+=1;}
paint(g);
}
Step:
public void step(){
System.out.println("step");
if(state==2){
System.out.println("state2");
if(mov){
System.out.println("mov i step!");
if(Math.abs(cx-x)<2 && Math.abs(cy-y)<2){mov=false;}else{
int l=(int)(Math.sqrt((int)((cx-x)*(cx-x)+(cy-y)*(cy-y)))/5);
if(l==0){l=1;mov=false;}
x+=(int)((cx-x)/l);
y+=(int)((cy-y)/l);
}
}
else{
double degree = (Math.atan2 (my-y, mx-x)) * 180 / Math.PI;
System.out.println("Degree: "+Double.toString(degree));
}
}
if(state!=0){
try{String r="";
r=in.readLine();
if(r!=""){
System.out.println(r);
if(nodename(r).equals("loginok")){
myid=new Integer(nodevalue(r,"id")).intValue();
state=2;
}
}
}catch(IOException ex){System.out.println("IOException at step: "+ex.getMessage());}
}
}
Przy kompilacji nie ma błędów, ale gra jest "wstrzymana".
Co może być źle?
Sprawdzam stan wątków i każdy zawsze(oprócz uruchamiania) ma stan RUNNABLE.
Próbuję wywołać funkcję run() ponownie, ale to nic nie daje.
Co mogę zrobić?
« Ostatnia zmiana: Czerwiec 10, 2010, 14:45:56 wysłana przez programistagd »

Offline Mr. Spam

  • Miłośnik przetworów mięsnych

Offline Capad

  • Użytkownik

# Czerwiec 09, 2010, 22:17:58
Blokujesz zmienne?
Sychronizujesz wątki?
Dlaczego ustawiasz minimalny priorytet?

Widzę, że metoda Kopiego-Pasta ;)

Offline programistagd

  • Użytkownik
    • WeHaveIdea

# Czerwiec 09, 2010, 22:22:06
Może to głupie, ale się spytam: co to znaczy "blokować zmienne"? ;)
Tak stosuję tą metodę czasem.
Tak wgl. to nic nie kombinuję z wątkami specjalnego, a gra pauzuje się tak:
-odbieram "loginok"
-wykonuję step
-i tu jest freeze.
Dzięki za odpowiedź.

Offline Pomar1

  • Użytkownik

# Czerwiec 09, 2010, 22:26:10
Poszukaj, może gdzieś w wątkach zapomniałeś o while(true)

Offline programistagd

  • Użytkownik
    • WeHaveIdea

# Czerwiec 09, 2010, 22:53:54
Mam tylko jedną taką pętlę.
Gra się zatrzymuje tylko w jednym momencie(wcześniej działa).

Offline kamilek

  • Użytkownik

# Czerwiec 09, 2010, 23:19:51
@up
to w końcu gra chodzi w pewnym sensie czy nie !?

Najpierw napisałeś, że po zalogowaniu się przestaje działać jak dla mnie znaczy to, iż wcale nie da się grać.
Teraz z kolei napisałeś że:
Cytuj
Gra się zatrzymuje tylko w jednym momencie(wcześniej działa).

to w końcu jak jest !?


Offline programistagd

  • Użytkownik
    • WeHaveIdea

# Czerwiec 10, 2010, 14:15:25
"Gra" działa, ale nie da się grać.
Dla mnie wyświetlenie panelu logowania to też jakieś działanie.
Właśnie po zalogowaniu cała "aplikacja" się zatrzymuje, ale odbiera eventy, np. mouseClicked() itp.

st3tc

  • Gość
# Czerwiec 10, 2010, 14:19:49
Niemiecki znasz ?

Offline programistagd

  • Użytkownik
    • WeHaveIdea

# Czerwiec 10, 2010, 14:45:29
Cytuj
Iś bin Dojśland - żart
Znam angielski + domyślam się na podst. kodu.
« Ostatnia zmiana: Czerwiec 10, 2010, 14:50:59 wysłana przez programistagd »

Offline Capad

  • Użytkownik

# Czerwiec 10, 2010, 16:33:03
Szkoda, że "rżniesz głupa" ;)
W kodzie, jak zauważył st3tc, była pewna podpowiedź ;)

Offline programistagd

  • Użytkownik
    • WeHaveIdea

# Czerwiec 10, 2010, 22:23:47
Trochę nie kapuję: "jest prawdziwe tak długo, jak ponownie uruchomić wątku".
Ale chodzi tu raczej o pętlę nieskończoną trwającą do przerwania wątku.
Sprawdziłem i wątki nie mają statusu interrupted, mają alive i są RUNNABLE.