thread, variable abfragen

Status
Nicht offen für weitere Antworten.

vodn7v

Bekanntes Mitglied
hallo,
ich habe hier einen thread laufen. im thread läuft ein counter der von 0 an einfach hochzähl.

ich möchte einfach aus einer anderen klasse auf die variable "time" zugreifen und den aktuellen counterstand abzufragen, während der counter weiter läuft. aber irgednwie krieg ich das net so ganz hin.
wenn ich eine methode schreibe die time zurückgibt dann ist sie immer 0.
wird die variable time nicht komplett überschrieben immer und müsste in der ganzen klasse verfügbar mit dem aktuellen counterstand sein ?

vielen dank



Code:
public class MachineTimer extends Thread implements Runnable  {
	
	private int time = 0;
	private boolean running = false;
	
	 public void start(){ 
		
	      if (time > 4000000){ 
	         time = 0; 
	          } 
	      running = true; 
	   } 
	public void run(){ 
		
		start();
		
		
	   while (running){ 
		 
	       sleepOneSec(); 
	
	      } 
	}
	 
	private void sleepOneSec( ){ 
	   try 
	   { 
	       Thread.sleep(1000); 
	       time++; 
	       System.out.println("Time: "+time);
	       if (time == 0 ){
	    	   running = false; 
	       }
	} 
	catch (Exception e) {} 

	}
	
}
 
du hast da dummerweise die reservierte Operation start() überschrieben,
mit der standardmäßig ein Thread gestartet wird,
damit ist alles kaputt,

so gehts:
Code:
public class MachineTimer
    extends Thread
{

    private int time = 0;
    private boolean running = false;

    public void myStart()
    {
        if (time > 4000000)
        {
            time = 0;
        }
        running = true;
    }

    public void run()
    {
        myStart();
        while (running)
        {
            sleepOneSec();
        }
    }

    private void sleepOneSec()
    {
        try
        {
            Thread.sleep(100);
            time++;
            System.out.println("Time: " + time);
            if (time == 0)
            {
                running = false;
            }
        }
        catch (Exception e)
        {
        }
    }

    /**
     * @return time
     */
    public int getTime()
    {
        return this.time;
    }

    public static void main(String[] args)
        throws Exception
    {
        MachineTimer m = new MachineTimer();
        m.start();

        Thread.sleep(400);
        System.out.println("main liest time: " + m.getTime());
        Thread.sleep(400);
        System.exit(0);
    }
}

oder auch
Code:
 public void start()
    {
        if (time > 4000000)
        {
            time = 0;
        }
        running = true;
        super.start();
    }

    public void run()
    {
        while (running)
        {
            sleepOneSec();
        }
    }
aber dann auch keinen Fall in run() nochmal start() aufrufen!
start() wird von außen zum Starten des Thread aufgerufen
 
vor allem warum von Thread erben UND runnable implementieren ?

edit: achja.. slater hats ja
 
vielen Dank schonmal fuer dir Hilfe.
aber so richtig funtkioniert das nicht. was habe ich falsch gemahcht ? bekommt immer noch "0" zurückgeliefert bei jedem aufruf.

Code:
public class MachineTimer extends Thread implements Runnable  {
	
	private int time = 0;
	private boolean running = false;
	int diffTime = 0;
	int mach_time = 0;
	
	public int getTime()
	{
		return this.time;
	} 

	 public void myStart() 
	    { 
	        if (time > 4000000){ 
	            time = 0; 
	        } 
	        running = true; 
	    } 

	    public void run() 
	    { 
	        myStart(); 
	        while (running) 
	        { 
	            sleepOneSec(); 
	        } 
	    } 

	
	private void sleepOneSec( ){ 
		
	   try 
	   { 
	       Thread.sleep(1000); 
	       time++;       
	       System.out.println("Time: "+time);
	       if (time == 0 ){
	    	   running = false; 
	       }
	} 
	catch (Exception e) {} 

	}
}

andere klasse:

Code:
.
.
.
.
MachineTimer m = new MachineTimer();
  
		int timer = m.getTime();
		
		System.out.println("Zeit: "+timer);
.
.
.

vielen dank !!
 
schau dir doch mein Beispiel genau an..
da warte ich erst eine gewisse Zeit, damit der Thread Zeit hat, time zu erhöhen

wenn er 1000ms braucht, dann warte mindestens 1000ms,
bei den allgemeinen Ungenauigkeiten am besten mindestens 1100ms
 
ok das macht sinn 🙂

habe es jetzt so :

Code:
....
		MachineTimer m = new MachineTimer();
		
		    Thread.sleep(1100); 
		    int timer = m.getTime();

......

er kriegt aber immer noch 0 zurück.

ne andere frage am rande. woher weiss das programm wenn ich Thread.sleep sage welchen thread er pausieren soll.
ich habe noch einen 2ten thread laufen.
woher weiss er das er den thread aus MachineTimer nehmen soll ?
also das macht er mit dem pausieren schon. aber wieso ist der so schlau ?? 🙂
 
wenn du MachineTime schlafen legen willst ruf einfach

Code:
      try{
          m.sleep(1100); 
} catch (InterruptedException e){
System.err.println(e);
}
auf
 
quatsch,
jeder Thread kann nur sich selber schlafen legen, das ist ja auch eine statische Operation

> woher weiss das programm wenn ich Thread.sleep sage welchen thread er pausieren soll
wie gesagt, man selber ist ein Thread, also legt man sich selber schlafen,

dass du als Programmierer genau überblicken kannst, welcher Thread gerade welchen Code ausführt, ist natürlich ein ganz anderes Problem,

-----

zu deinem Code nochmal:
hast du auch irgendwo
m.start()?
erscheinen die Ausgaben
System.out.println("Time: "+time);
alle Sekunden?

nochmal: siehe meine Programm, das läuft..
 
SlaterB hat gesagt.:
zu deinem Code nochmal:
hast du auch irgendwo
m.start()?

erscheinen die Ausgaben
System.out.println("Time: "+time);
alle Sekunden?

nochmal: siehe meine Programm, das läuft..


also ich starte den thread in einer anderen klasse die sozusagen die "main" klasse darstellt.
die ausgaben erscheinen sekündlich. auch das schlafen legen des threads funktioniert.


--

aber nicht das auslesen der time variable.
habe deinen code mal 1zu1 kopert. wenn ich die klasse starte funktioniert es auch. aber nur wenn der thread auch in dieser klasse gestartet wird. und dann nach ablauf der ms dann abfragt wie der aktuelle status ist.

z.B.

Thread start --> thread.slee(1100) dann wird der thread nach 1100ms abgefragt nachdem er gestartet wurde.

ich möchte ihn aber mittendrin abfragen. halt mit aufruf einer funktion.

wenn der timer bei 34543 steht will ich diese zahl auslesen.

danke dir !!
 
hmm.. ja ..versteckt ^^


also eig nur die aussage, dass es so wie du mir gezeigt hast nicht funktioniert.
und ich nicht weiss wieso er nicht den "richtigen" counter-wert zurückgibt sondern nur die zeit die ich in thread.sleep angebe.

da fragt er den counter dann nämlich ab. und nich dann wenn ich die methode starte. und der counter vllt schon bei 1mio ist.


danke dir
 
wer fragt wen wann warum wo wieso ab?
wenn du irgendwas von deinem Programm erzählst bekomme ich davon nicht viel mit,

einfach ein Programm posten so ähnlich wie meins und alles ist sonnenklar

selbst dann gilt aber immer noch:
war da eine Frage dabei?

was passiert, was soll stattdessen passieren
 
alles klar.. dann versuch ichs mal ausführlich 🙂

also ich habe eine art mainklasse in der ich ganz zu anfang des programms mehere threads starte. unter anderem auch den hier :

Code:
		Thread  t = new Thread(new MachineTimer());	
		t.start();

das ganze passiert nur 1x und nur beim starten des programms.
von da an läuft der counter.

ein 2ter thread empfängt lognachrichten die dann bearbeitet werden.
falls eine bestimmte nachricht ankommt wird dieser teil gestartet.

Code:
   if(level.equals("<199>")){
		   level = "Machine-Online";
		  System.out.println("Maschine: "+SsenderId+","+Stype+" online");
		  
		MachineTimer m = new MachineTimer();
		
		    Thread.sleep(1900); 
		    int timer = m.getTime();

		System.out.println("Zeit: "+m.getTime());

		try {SqlData.setMachineOnline(SsenderId,Status,timer);} catch (SQLException e) {e.printStackTrace();}
		 

	   }


ich möchhte dann dien count aus der MachineTimer klasse haben um sie in meiner datenbank zu speichern.

jedes mal wenn eine nachricht ankommt wir dann der count mit daten gespeichert.
ist die differenz des aktuellen counts und dem count in der db größer 30 wird ein status geändert.

dafuer brauch ich das ganze 🙂

ich hoffe das es jetzt etwas verständlicher ist und du mir sagen kannst wie ich in etwa an diesen countwert komme.

im moment ist es halt so wenn ich erst den timer starte.. und erst nach beliebiger zeit den count abfrage dieser 0 ist.
in deinem beispiel wir er ja gestartet und direkt danach abgefragt was auch funktioniert.
aber anders geht es irgednwie nicht.


danke dir !!
 
vodn7v hat gesagt.:
Code:
   if(level.equals("<199>")){
		   level = "Machine-Online";
		  System.out.println("Maschine: "+SsenderId+","+Stype+" online");
		  
		MachineTimer m = new MachineTimer();
		
		    Thread.sleep(1900); 
		    int timer = m.getTime();

		System.out.println("Zeit: "+m.getTime());

		try {SqlData.setMachineOnline(SsenderId,Status,timer);} catch (SQLException e) {e.printStackTrace();}
		 

	   }

Hallo hier wird ja eine neue Instanz von MachineTimer erzeugt. Die hat erstens mit der alten Instanz gar nichts zu tun.
Und zweitens wird diese auch nicht gestartet. Ergo liefert m.getTime() immer 0.
 
jau hab ich auch grad bemerkt. dummer fehler sorry.
aber es läuft jetzt. also kome an die variable dran 🙂)

vielen dank an euch alle !!!
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben