» »

Java pomoč / Runnable problemi

Java pomoč / Runnable problemi

Serial ::

Zdravo..rabil bi pomoč pri uporabi niti z Runnable načinom.
Delam preprosto applet igro katero lahko igrata dva igralca.
Ko se igra starta se začne za vsakega igralca odštevati čas. Če čas poteče je igralec izgubil.
Če je igralec pravilno odgovoril na vprašanje se začne čas odštevati od začetka in tako naprej.
	class RCountDown implements Runnable {

		private boolean run=true;
		private int c;

		public void run() {
			c = 20;
			while (c > -1 && run==true) {
				try {
					Thread.sleep(1000);
				} catch (InterruptedException x) {
				}
				Cas_desni.setText("Čas: " + c--);
			}
		}

		public void stop() {
			run = false;
		}
		
	}

Runnable Rrunnable = new RCountDown();
Thread Rcount = new Thread(Rrunnable);


Zdej kar bi jaz hotel naredit je tole
if (answer==corect){  //psevdo koda
Rcount.stop();   // Prvo bi rad ustavil metodo oziroma jo ubil ampak mi to ne uspe
Rcount.start();   // nato bi jo spet štartal
}


Zadeva mi ne uspe. Če dam samo Rcount.stop(); mi ne ubije niti kar sem preveril preprosto s tem:
                        Rcount.stop();
			if(Rcount.isAlive()== true){
			System.out.print("Is alive");
			}


Bi mi znal kdo pomagat?
Hvala, Lp

illion ::

1. ti sploh ne kličeš stop() metode od RCountDown objekta, ampak od Thread objekta, ki je, mimogrede "deprecated".
zakaj:
Runnable Rrunnable = new RCountDown();  //kle castaš RCountDown objekt v Runnable objekt in s tem zgubiš možnost klicanja tvoje stop() metode.
Rrunnable.stop(); //ne obstaja

//če delaš svoj class z metodami, ki bi jih rad klical, nared potem dejansko instanco tega razreda:
//Runnable Rrunnable = new RCountDown();
RCountDown Rrunnable = new RCountDown();
Rrunnable.stop(); //obstaja


2. ti ta Runnable podaš v konstruktor Threadu, nato pa kličeš stop() metodo tega Threada. Thread ima svojo, deprecated metodo stop(), ki nima veze s tvojo metodo stop v RCountDown. Če hočeš uporabit tisto metodo, potem jo kliči direktno:
RCountDown Rrunnable = new RCountDown();
Rrunnable.stop();


3. Predlagam ti, da uporabiš kar direktno Thread objekt brez Runnable, ker je s tem manj dela:
class RCountDown2 extends Thread { 
	  
    private boolean run=true; 
    private int c; 

    public void run() { 
        c = 20; 
        while (c > -1 && run==true) { 
            try { 
                Thread.sleep(1000); 
            } catch (InterruptedException x) { 
            } 
            Cas_desni.setText("Čas: " + c--);
        } 
    } 

    public void stopp() { //namesto da overridaš metodo stop(), nared svojo
        run = false; 
    }     
} 

RCountDown2 Rcount = new RCountDown2(); 
..
Rcount.start();
..
Rcount.stopp();


4. nit rabi nekaj časa da se ustavi, mogoče je bila ravno v sleep stanju ko si klical stop. Ne preveri takoj, če je nit še alive, ampak počakaj nekaj časa:
//deluje v vseh 3 primerih; 
//v tvojem primeru, ko kličeš stop() metodo Thread objekta, 
Rcount.stop(); 
//v primeru, če kličeš stop() metodo RCountDown objekta 
RCountDown Rrunnable = new RCountDown();
Rrunnable.stop()
//ali pa če kličeš stopp() metodo  extendanega Thread objekta, ki sem ga napisal v točki 3:
Rcount.stopp(); 

//počakaj recimo 1 sekundo, nato izpiši stanje:
try { Thread.sleep(1000); } catch (Exception err) { } 
System.out.println("alive: " + Rcount.isAlive());


zdej boš pa najbrž mel problem, kako thread "na novo startat" :D (vprašej, če ne boš znal..)

Zgodovina sprememb…

  • spremenil: illion ()

Spura ::

Thread.sleep je lahko interrupted, ti bos pa eno sekundo odstel. Moral bi odsteti dejanski preteceni cas.

Serial ::

Hvala za pomoč :)
In ja res imam problem reštartat thread :P
Sem mislim da je to enostavno, da rabim samo potem še enkrat klicat start() metodo sam ni to to.
Sem neki googlav in najdel kako naj bi se to naredilo vendar ne znam to napisat v javi :/

Bi mi lahko še to pomagal, hvala ?

Spura ::

Zakaj preprosto ne naredis nov thread? Zakaj rabis restart?

Serial ::

Sem mislil da obstaja kaka bolj elegantna rešitev :)

illion ::

v tvojem primeru je res najlažje samo na novo narest Thread, drugače pa lahko narediš s pause/resume, nekak tkole:

class RCountDown2 extends Thread { 
       
    private boolean run=true;
    private boolean paused=false;
    private int c; 
 	private int defaultPriority = 1;
    public void run() { 
        c = 20; 
        while(run==true){
        	while(paused)
        		continue;
	        if(c > -1) { 
	            try { 
	                Thread.sleep(1000); 
	            } catch (InterruptedException x) { 
	            } 
	            Cas_desni.setText("Čas: " + c--);
	        } 
                //kle lahko dodaš kodo, ki avtomatsko konča thread, ko čas poteče
                //else{ run = false; }
        }
    } 
 	public void pause(){
 		paused = true;
 		defaultPriority = getPriority();
 		setPriority(Thread.MIN_PRIORITY);
 	}
 	public void resume(boolean resetCounter){
 		if(resetCounter)
 			c = 20;
 		setPriority(defaultPriority);
 		paused = false;
 	}
    public void stopp() { //namesto da overridaš metodo stop(), nared svojo
        run = false; 
    }     
} 


oz. prilagodiš while zanke da ustrezajo tvojemu problemu..

edit: zakaj je zdej ta post zelen :D ?

Zgodovina sprememb…

  • spremenil: illion ()

Serial ::

Hej hvala..sam sm že uporabil tisto neelegantno varjanto.. :P
Bom pa vedu za drugič.. :)
Hvala :)


Vredno ogleda ...

TemaSporočilaOglediZadnje sporočilo
TemaSporočilaOglediZadnje sporočilo
»

Keylogger

Oddelek: Programska oprema
352644 (1371) Blisk
»

[C#] pixel scan z Thread

Oddelek: Programiranje
121176 (958) perooo25
»

[Java] Nova nit znotraj JPanel.paintComponent()

Oddelek: Programiranje
141960 (1747) alexa-lol
»

POMOČ: C# Spremenitev spremenljivke medtem ko teče ukaz while

Oddelek: Programiranje
91648 (1405) Ericssony
»

[JAVA] zaustavitev niti (threadov)

Oddelek: Programiranje
223183 (3183) morbo

Več podobnih tem