Permalänk
Medlem

[java] problem med tråd.

Tjena!
Det är nämligen så att jag behöver göra ett litet skolprojekt i java som har "multithreading" och eftersom jag aldrig tidigare jobbat med trådar så tänkte jag skapa ett litet projekt så att jag kan lära mig om hur trådar byggs upp och hur de funkar. Tanken är att jag ska göra en alarmklocka som läser "systime" och skriver ut den på skärmen och när systime == användarens inmatning så ska den tjuta.
Problemet jag stött på är att systime som skrivs ut i textField inte uppdateras... dvs när framen skapas så skrivs tiden ut men ingen uppdatering sker vilket får mig att tro att det är något fel på min tråd.

Kodstrukturen är ganska dålig, hoppas ni klarar av o läsa.

public class time implements Runnable { Thread th; int hour,aH; int min,aM; int sec; String digits; String H; String M; String S; Calendar time= Calendar.getInstance(); public void run() { hour=time.get(Calendar.HOUR_OF_DAY); min= time.get(Calendar.MINUTE); sec= time.get(Calendar.SECOND); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } public boolean check() { boolean check=false; if(hour==aH&&min==aM) check=true; return check; } public void setAlarm(int a) { digits=Integer.toString(a); H=digits.substring(0,2); M=digits.substring(2, 4); aH=Integer.parseInt(H); aM=Integer.parseInt(M); } public int getH() { return hour; } public int getM() { return min; } public int getS() { return sec; } }

Min andra klass där jag skapar objektet och startar tråden (förhoppningsvis).

time t=new time (); Thread th= new Thread(t); th.start();

Tack på förhand!

Permalänk
Medlem

Skulle tro att då du kör th.start() så körs väl din tråds run() metod. Vilket sätter de initiala värdena. Men efter detta så händer det inte så mycket mer, du loopar ju aldrig något så i samma skede som din tråd startas är den även färdig med allt arbete också. Rätta mig om jag har fel, var ett tag sedan jag satt i Java.

Visa signatur

In order to understand recursion, one must first understand recursion

Permalänk

Så länge du inte loopar din run() kommer den inte köra många gånger. Gör en while-sats i den!

Visa signatur

Corsair Vengeance LPX 4x8GB DDR4 2666MHz CL16 | Intel Core i7 6700 3,4 GHz 8MB | MSI Z170A KRAIT GAMING | Corsair Force Series 3 120 GB | Seagate SSHD Desktop 2 TB 7200 RPM 3,5" | Creative Sound Blaster Z PCIe | Western Digital 500 GB | Samsung Writemaster | Corsair TX750 V2 750 W | EVGA GeForce GTX 970 4GB SSC ACX 2.0+| Fractal Design Define R5 (Svart)

Permalänk
Medlem

Det du nämner tänkte jag också på så därför gjorde jag metoden "check()" och i run() hade jag while(check()) men det blev ingen ändring klockan stod fortfarande still :/

Permalänk
Medlem

Kan det vara som i Windows Forms, att det bara är den tråd som skapat fönstret och har alla ui-kontrollerna som kan uppdatera ui-kontrollerna? I så fall måste den nya tråd du skapar på något sätt lämna över jobbet att uppdatera textfältet till ursprungstråden.

Det var 10 år sedan jag knackade Java sist, så jag minns inte. Det var bara en tanke.

Visa signatur

5950X, 3090

Permalänk

När du skapar objektet time ansätter du också dess tid, och den kommer inte att ändras.
Gör en while-loop inne i run-metoden som gaminggirl föreslog och lägg raden time= Calendar.getInstance() innanför loopen.

Permalänk
Medlem
Skrivet av backfeed:

Kan det vara som i Windows Forms, att det bara är den tråd som skapat fönstret och har alla ui-kontrollerna som kan uppdatera ui-kontrollerna? I så fall måste den nya tråd du skapar på något sätt lämna över jobbet att uppdatera textfältet till ursprungstråden.

Det var 10 år sedan jag knackade Java sist, så jag minns inte. Det var bara en tanke.

Osäker på i fall jag fattar. Tanken med mina "get" metoder va just det att de skulle retunera timmar, minuter och sekunder så att tråden som har hand om UI:t uppdaterar med data som den andra tråden tagit fram.
Hoppas någon mer erfaren kan svara på frågan.

Permalänk
Medlem

Kan detta funka?

public void run() { while(!check()) { time= Calendar.getInstance(); hour=time.get(Calendar.HOUR_OF_DAY); min= time.get(Calendar.MINUTE); sec= time.get(Calendar.SECOND); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public boolean check() { boolean check=false; if(hour==aH&&min==aM) check=true; return check; }

Permalänk
Medlem
Skrivet av Z3R0:

Kan detta funka?

public void run() { while(!check()) { time= Calendar.getInstance(); hour=time.get(Calendar.HOUR_OF_DAY); min= time.get(Calendar.MINUTE); sec= time.get(Calendar.SECOND); try { Thread.sleep(1000); } catch (InterruptedException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } public boolean check() { boolean check=false; if(hour==aH&&min==aM) check=true; return check; }

public boolean check(){ boolean check=false; if(hour==aH&&min==aM) check=true; return check; }

är ekvivalent med

public boolean check() { return hour==aH&&min==aM; }

Permalänk
Medlem
Skrivet av Kejsarn:

public boolean check(){ boolean check=false; if(hour==aH&&min==aM) check=true; return check; }

är ekvivalent med

public boolean check() { return hour==aH&&min==aM; }

tack... men hur skulle det lösa mitt tråd problem?