Sleep Funktion

Fohnbit

Top Contributor
Hallo

Ich schreibe zyklisch in eine Variable.
Bsp.:
a = a + "dfhf"

später wieder einmal:
a = a + "iop"

Nun müsste ich folgendes machen:
Wenn x Millisekunden nach dem schreiben in die Variable a kein weiterer Wert erfolgt, soll eine Function ausgeführt werden.
Sollte innerhalb der x Millisekunden ein neuer Wert in die Variable geschrieben werden, resetet der Countdown und startet neu.

Für einen Ansatz wäre ich dankbar!
 

njans

Top Contributor
Es klingt komisch was du vorhast. Aber gut:
Du startest einfach einen Timer ([JAPI]swing.timer[/JAPI]), welcher dann nach einem Delay etwas ausführt.
 

Fohnbit

Top Contributor
Hallo

Danke für den Tipp. Leider komme ich noch nicht ganz zurecht was einmal ausführen und wiederholtes Ausführen betrifft.
Hast du eventuell ein paar Zeilen die mir helfen ?

Danke!
 

njans

Top Contributor
Java:
int delay = 1000; //milliseconds
  ActionListener taskPerformer = new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
          // if changed, do something
      }
  };
  new Timer(delay, taskPerformer).start();

Hilft das?
 

Fohnbit

Top Contributor
Hallo

Danke, so hatte ich das schon.
Aber hier startet er ja immer wieder in dem angegeben Intervall, oder?
ich bräuchte nur einmal das er verzögert startet.

Ich muss aber einen laufenden Timer wieder abbrechen und neu starten können.

Danke!
 
M

Marcinek

Gast
Dann schau dir mal an, was der Timer so kann, denn alle deine Anforderungen stehen perfekt in der entsprechenden JavaDoc beschrieben.

Oder google: java using Timer
 

Fohnbit

Top Contributor
@Marcinek: Es für dich sicher hilfreich, wenn du aus der Doku das raus lesen kannst was zur Lösung beiträgt. Aber ich kenne die Doku und ich weiß wie man google einsetzt. Sonst hätte ich dieses Forum nicht gefunden. Daher möchte ich die bitten, mir keine Verweise mehr auf google zu posten. Dank dir!

Java:
		    	    	   timer = new Timer(0, taskPerformer);
		    	    	   timer.setInitialDelay(delay);
		    	    	   timer.start();

Sollte der Aufruf nicht einmal mit einer Verzögerung von "delay" starten? Er feuert mir immer die folgende:
Java:
ActionListener taskPerformer = new ActionListener() {
   	    	 	@Override
					public void actionPerformed(ActionEvent e) {
						// TODO Auto-generated method stub
							try {
								SC.setAnswer(Nachricht);
								Nachricht = ""; 
							} catch (UnsupportedEncodingException e1) {
								// TODO Auto-generated catch block
								e1.printStackTrace();
							}
					}
   	    	   };

in "delay" Millisekunden.

Erschwerend kommt hinzu das die Daten aus einer TCP Verbindung stammen. Hab zwar geprüft wenn NULL oder "" soll er den Timer ignorieren, aber ich erhalte einmal die "Nachricht" und dann zyklisch die Leere Zeichenketten.

Auch das Abbrechen scheint nicht so ohne zu sein?
Ich muss zuerst prüfen ob der timer NOT NULL und dann noch ob der timer läuft und erst dann kann ich ihn killen?

Mir kommt das nicht Ressourcen schonend vor, oder wo habe ich hier meinen Fehler?

Die ganze Anwendung schaut so aus:
Aus einer TCP Verbindung bekomme ich Strings. Diese sollen zusammengesetzt werden, sofern eine Pause zwischen den ankommenden Daten sind.
So soll aus:
Hello W
pause 5 ms
orld
pause 300 ms
here
pause 10 ms
we are
pause 1000 ms

Daraus soll eine Function zwei Aufrufe einer anderen Function machen, mit den 2 Strings:
"Hello World"
"here we are"
bei einer delay zeit von 100 ms

Hoffe ich konnte mein Vorhaben verständlich umschreiben.

Danke!
 

Fohnbit

Top Contributor
Nochmals Hallo

Bin nun auf die .setReoeats aufmerksam geworden. Damit scheint es zu klappen.
Java:
		public void run() {
		try {
			  // Werte nach x Millisekunden ausgeben
			 int delay = 3000;
			 
	    	  ActionListener taskPerformer = new ActionListener() {
   	    	 	@Override
					public void actionPerformed(ActionEvent e) {
						// TODO Auto-generated method stub
							try {
								SC.setAnswer(Nachricht);
								Nachricht = ""; 
							} catch (UnsupportedEncodingException e1) {
								// TODO Auto-generated catch block
								e1.printStackTrace();
							}
					}
   	    	   };
   	    	   
			 while(SC.clientSocket.isConnected()){
				 
		    	  BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(SC.clientSocket.getInputStream()));
		    	      char[] buffer = new char[200];
		    	      //blockiert bis Nachricht empfangen
		    	      int anzahlZeichen = bufferedReader.read(buffer, 0, 200);
		    	      tmpNachricht = new String(buffer, 0, anzahlZeichen);
		    	     		    	      
		    	      if(tmpNachricht != null | tmpNachricht.length() > 0){
		    	    	   Nachricht = tmpNachricht + Nachricht; 
		    	    	   if(timer != null){
		    	    		   if(timer.isRunning()){
		    	    			   timer.stop();
		    	    		   }
		    	    	   }
		    	    	   timer = new Timer(0, taskPerformer);
		    	    	   timer.setInitialDelay(delay);
		    	    	   timer.setRepeats(false);
		    	    	   timer.start();
		    	      }   
		    	    	    	    
			 }

Aber ist das ein guter Weg? Der code soll im 24/7 Betrieb laufen. Daten werden alle 1000 Millisekunden empfangen.
 
M

Marcinek

Gast
Bist du dir sicher, dass du den korrekten Timer benutzt?

Timer (Java Platform SE 7 )

aus java.util? Da sehe ich nicht den Konstruktor, den du verwendest (Timer(0, actionPerformer)).


Du befindest sich in einem Thread und dann hast du einen statischen zugriff auf eine Klasse "SC". Wie unterscheidest du den hier, wer was aus welcher Connection wie macht?

Es gibt viele Tutorials und auch hier mehrere Threads zu dem Thema eines aufbaus von Chat servern. Ich gehe davon aus, dass dir das weiterhelfen wird.

google: java simple chatserver

Aus deiner Beschreibung werde ich nicht so ganz schlau, was der sinn hier ist. Ist das eine Übung oder etwas, dass konkret zur Lösung eines Problems beitragen soll?

@Marcinek: Es für dich sicher hilfreich, wenn du aus der Doku das raus lesen kannst was zur Lösung beiträgt. [...] Daher möchte ich die bitten, mir keine Verweise mehr auf google zu posten. Dank dir!

Dann hast du den Sinn dieses Forums nicht begriffen.
 

Fohnbit

Top Contributor
Hallo Marcinek

bezüglich Sinn und google. Ich wollte nicht unhöflich sein, aber nur ein Link zur Doku hilft mir nicht, da ich die Java Doku ja an sich selber gefunden habe. Hilfreich wäre eine Stelle in der Doku zu nennen.

Ich habe nun denn aus java.util eingebaut. Der klappt auch. Denk ich hatte den aus java.swing(?)

Es sieht nun so aus:
Java:
public void run() {
		try {
  	    	   
			 while(SC.clientSocket.isConnected()){
				 
		    	  BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(SC.clientSocket.getInputStream()));
		    	      char[] buffer = new char[200];
		    	      //blockiert bis Nachricht empfangen
		    	      int anzahlZeichen = bufferedReader.read(buffer, 0, 200);
		    	      tmpNachricht = new String(buffer, 0, anzahlZeichen);
		    	     		    	      
		    	      if(tmpNachricht != null | tmpNachricht.length() > 0){
		    	    	   Nachricht = tmpNachricht + Nachricht; 
		    	    	   if(timer != null){
		    	    		   timer.cancel();
		    	    	   }
		    	    	   
		    	    	timer = new Timer();
		   				timer.schedule(new TimerTask() {
		   			        public void run() {
		   			            // Task here ...
		   			     	try {
								SC.setAnswer(Nachricht);
								Nachricht = ""; 
							} catch (UnsupportedEncodingException e) {
								// TODO Auto-generated catch block
								e.printStackTrace();
							}
							              }
		   			    }, delay);
		    	      }   
		    	    	    	    
			 }		 
			 SC.inFromServer.close();
			 SC.setAnswer("Thread beendet");
				
			 
			 
		} catch (UnknownHostException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}
}

Um auf deine Frage des Sinn des Codes zu kommen:
Ich möchte mir in Java ein Addon für ein System schreiben, dass ich zu Hause nutzen kann.
Das "Muttersystem" hat eine Entwicklungsumgebung um eben eigenen Java Code ins System zu bringen und somit das Potenzial der Muttersoftware zu steigern.

Ich möchte mir einen generischen bidirektionalen TCP Client schreiben, damit ich diverse IP Geräte ansprechen kann.
Konkret zum Beispiel:
Logitech Squeezebox Mp3 Player
ATC-1000 RS232/RS422/RS485 serial Device (daran hängen dann RS485 Geräte und so weiter)

Über meinen Code bekomme ich die Daten aber abgehackt. Denn woher weiß den auch der TCP Client wann die Daten vom Quellgerät fertig gesendet sind. Entweder Carriage return oder über eine Zeitspanne von Inaktivität.

Damit sind wir beim Kern.
Die Wetterstation in meinem Haus sendet über RS485 die aktuellen Daten (Temperatur, Helligkeit, ...)
Diese werte ich in java aus und steuere damit das Haus.
Jedoch muss ich die Datenblöcke richtig lesen. Daher die timer Sache hier.
Eine Chatsoftware wäre "einfacher", da mittels .readLine() jede Zeile eindeutig gegeben ist. Bei anderen Geräten gibts das leider nicht.

Mein Client baut nur zu EINEM Gerät eine Verbindung auf! Daher kann ich die Daten vom Thread einfach zurückgeben, ohne zu unterscheiden, von welchen Thread es kommt. Es darf ja auch nur einer existieren.

Könntest du mir noch bestätigen ob das abbrechen eines Timer richtig ist? .isRunning gibts bei java.util nicht.

Im groben scheint es nun zu klappen (ersten 10 min) ... wobei aber der andere Thread zwecks Vebrindungsabbruch ebenso wichtig wäre.

Schöne Grüße!
 

JanHH

Top Contributor
Hm ich würd das ganz anders machen, besonders schwierig kommts mir allerdings nicht vor.

1. Eine Klasse bauen, die einen String kapselt und synchronisierten Schreib- und Lesezugriff darauf zur Verfügung stellt. Ausserdem wird beim Schreiben jeweils der Timestamp, wann das zuletzt passiert ist, gespeichert (System.currentTimeMillis)

2. In einer Endlosschleife jeweils Thread.sleep(x), danach gucken ob der letzte Schreibzugriff im Vergleich zum jetzt-Timestamp schon länger als die maximal erlaubte Zeit her ist, wenn nein, dann nix tun, wenn ja, dann String auslesen und das Objekt zurücksetzen. Wobei die Funktion, die das überprüft, auch innerhalb des Objektes stattfinden muss, damit die Synchronisation intakt bleibt (zwischen "prüfen ob timestamp.." und "ja? also lesen und neu" kann ja schon wieder der nächste Zugriff stattfinden, dessen Daten dann vom reset überschrieben werden würden).
 

Fohnbit

Top Contributor
Hallo Jan

Ich würde deinen Vorschlag gerne umsetzen.
zu 1. Soweit verständlich, aber synchronisierter Schreib- Lesezugriff sagt mir leider nichts. Muss ich die Variable speziell deklarieren? Der Sinn ist mir klar, aber die Umsetzung noch nicht.

zu 2. Wo soll die Endlosschleife laufen? In der Klasse von (1.)? Da würde mir ja die Klasse blockieren, oder?
zu 2.
Wobei die Funktion, die das überprüft, auch innerhalb des Objektes stattfinden muss
Hier weiß ich leider nicht welches Objekt du meinst.

Danke!
 

JanHH

Top Contributor
synchronized kennst du aber!?

Du baust eine Klasse die einen String als Member-Variablen hat sowie einen long für den timestamp. Die Klasse hat zwei Funktionen: a) an den String was neues anhängen, b) überprüfe, ob...

der thread, der die neuen Zeichenketten entgegennimmt, fügt sie mittels funktion a an den String an. Ein weiterer Thread in Deinem Programm läuft in einer Endlosschleife und ruft Funktion b auf. innerhalb von Funktion b wird ermittelt, welcher der beiden Fälle vorliegt, und ggf. wird der interne String des Objekts zurückgegeben (und wieder geleert).
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
M Thread.sleep() Funktion Java Basics - Anfänger-Themen 1
berserkerdq2 Warum muss man manchmal in der RUnmethode sleep in eine schleife tun? Java Basics - Anfänger-Themen 9
F Thread.sleep() Java Basics - Anfänger-Themen 5
S Berechnung der sleep time ist falsch Java Basics - Anfänger-Themen 46
B Threads Thread sleep() Method einfache Frage Java Basics - Anfänger-Themen 8
D Compiler-Fehler Wert auf Datenbank übertragen und Sleep Thread Java Basics - Anfänger-Themen 3
Spencer Reid JavaFX Memory Thread.sleep Java Basics - Anfänger-Themen 1
S Thread.sleep mit JProgressBar Java Basics - Anfänger-Themen 1
A Problem mit Thread.sleep Java Basics - Anfänger-Themen 4
I Thread.sleep (1000); Java Basics - Anfänger-Themen 1
Lord.Djerun (Netbeans) Bei TimeUnit.Seconds,Sleep() hängt sich das komplette Programm auf.. Java Basics - Anfänger-Themen 8
S Oberfläche aktualisiert nicht wegen sleep Java Basics - Anfänger-Themen 1
S sleep Java Basics - Anfänger-Themen 4
P Threads Thread.sleep() Java Basics - Anfänger-Themen 7
C Wie funktioniert sleep Java Basics - Anfänger-Themen 5
M Fehler bei Thread.sleep() Java Basics - Anfänger-Themen 5
B Thread.sleep() Java Basics - Anfänger-Themen 1
C Thread.sleep ratsam? Java Basics - Anfänger-Themen 6
L Thread.sleep Java Basics - Anfänger-Themen 6
G problem mit thread.sleep() Java Basics - Anfänger-Themen 6
E Threads Verständnisfrage bzgl. Threads und Sleep Java Basics - Anfänger-Themen 2
M Threads Thread.Sleep Problem im Zusammenhang mit GUI/ActionPerformed-Methode Java Basics - Anfänger-Themen 4
S Methoden Warum ist sleep static? Java Basics - Anfänger-Themen 9
T Thread Sleep() Java Basics - Anfänger-Themen 4
J Thread.sleep Java Basics - Anfänger-Themen 7
A Thread.sleep() unterbrechen? Java Basics - Anfänger-Themen 3
P Problem mit sleep Java Basics - Anfänger-Themen 24
S Thread.sleep () - Frage Java Basics - Anfänger-Themen 16
G Problem mit sleep() Methode Java Basics - Anfänger-Themen 7
M Frage zur Methode Thread.sleep() Java Basics - Anfänger-Themen 6
A [Fehlermeldung]Sleep-Befehl Java Basics - Anfänger-Themen 4
B Dauerschleife unterbrechen mit sleep() Java Basics - Anfänger-Themen 23
O Memory Thread.sleep() Java Basics - Anfänger-Themen 5
G Problem mit Thread Sleep! Java Basics - Anfänger-Themen 3
S Thread.sleep i.V.m Button.setText() Java Basics - Anfänger-Themen 8
G Schleife mit Thread.sleep pausieren Java Basics - Anfänger-Themen 12
M Zeitdifferenz von Ende - sleep(x) - Start von x abhängig Java Basics - Anfänger-Themen 6
M wait() sleep() geht nicht wirklich Java Basics - Anfänger-Themen 3
R Thread - sleep - interrupt Java Basics - Anfänger-Themen 18
S sleep()-Methode ? Java Basics - Anfänger-Themen 6
T for-Schleife durch sleep verzögern? Java Basics - Anfänger-Themen 1
M Thread.sleep(20) dauert 31ms ? Java Basics - Anfänger-Themen 7
E Anfänger Problem mit Thread.sleep() Java Basics - Anfänger-Themen 11
S Thread.sleep Java Basics - Anfänger-Themen 6
D extreme CPU Auslastung bei Sleep, etc. Java Basics - Anfänger-Themen 5
S Frage zu sleep() Java Basics - Anfänger-Themen 3
V Alternative zu Thread.sleep() ? Java Basics - Anfänger-Themen 6
F Sleep, pause, delay Java Basics - Anfänger-Themen 2
S Runtime.exec -> Thread.sleep -> Konflikt Java Basics - Anfänger-Themen 7
S sleep ohne runnable? Java Basics - Anfänger-Themen 8
A Thread.sleep Java Basics - Anfänger-Themen 9
W sleep "hängt" bei vielen Threads Java Basics - Anfänger-Themen 2
M sleep...?? Java Basics - Anfänger-Themen 2
E Hilfe bei rekursiver Funktion Java Basics - Anfänger-Themen 3
FunkyPhil94 Wert in einer Lambda Funktion erhöhen Java Basics - Anfänger-Themen 3
M Eine Funktion zuweisen Java Basics - Anfänger-Themen 3
V Die Funktion des neuen Schlüsselworts in Java Java Basics - Anfänger-Themen 1
M variable in anderer funktion aufrufen Java Basics - Anfänger-Themen 10
_user_q Wie eine Methode/Funktion aus einer Klasse mit Constructor aufrufen? Java Basics - Anfänger-Themen 20
nelsonmandela Problem bei Ausgabe einer Switch - Case Funktion Java Basics - Anfänger-Themen 5
W GUI - JButton ohne Funktion? Java Basics - Anfänger-Themen 24
J Rekursive Funktion und return statement Java Basics - Anfänger-Themen 3
F Wie kann ich eine Funktion schreiben, die nur in bestimmten Fällen einen Wert zurückgibt? Java Basics - Anfänger-Themen 5
R Buttons ohne Funktion Java Basics - Anfänger-Themen 2
I Generische Funktion Java Basics - Anfänger-Themen 3
E Pervasive PSQL insert funktion geht nicht Java Basics - Anfänger-Themen 9
C Java Funktion: externe Daten vom Internet einbinden Java Basics - Anfänger-Themen 2
T Log Funktion erstellen Java Basics - Anfänger-Themen 1
M Wie kann ich eine Methode aus einem Interface in eine Klasse implementieren, so dass sie ihre Funktion ausführt? Java Basics - Anfänger-Themen 7
H Den Wert einer rekursiven Funktion bestimmen Java Basics - Anfänger-Themen 5
J In main() Datei geöffnet, von anderer Funktion beschreiben Java Basics - Anfänger-Themen 3
M toDouble Funktion Java Basics - Anfänger-Themen 3
Tino1993 Ellipse über draw Funktion ohne spur wandern lassen Java Basics - Anfänger-Themen 6
X Ackermannsche Funktion Java Basics - Anfänger-Themen 32
F Arrays: Mathematische Funktion Java Basics - Anfänger-Themen 19
P Dezimal zu Hexadezimalzahl Funktion Java Basics - Anfänger-Themen 5
S Verwenden von throw Exception an der Funktion Java Basics - Anfänger-Themen 2
M Arrays in Funktion Kopieren und Bearbeiten Java Basics - Anfänger-Themen 4
B Funktion mit mehreren Rückgabewerten aka Prozeduren? Java Basics - Anfänger-Themen 12
J Dynamisches Array durch split()-Funktion? Java Basics - Anfänger-Themen 3
D Funktion nur 1 Rueckgabewert Java Basics - Anfänger-Themen 9
M Wie lang eine Funktion/Methode? Java Basics - Anfänger-Themen 51
N den inhalt eines array per funktion ausgeben Java Basics - Anfänger-Themen 8
R Ackermann Funktion Java Basics - Anfänger-Themen 2
B Treetable (rekursive Funktion) aufbauen von Datenbank Java Basics - Anfänger-Themen 4
D Funktion zwei Arraylisten zu verleichen ob gleich funktioniert nicht Java Basics - Anfänger-Themen 26
N Abfragen eines Textes aus einem JTextField in Java, Funktion, CardLayout, Java Basics - Anfänger-Themen 2
T Rekursion Warum bricht meine Funktion nicht ab Java Basics - Anfänger-Themen 4
N Funktion funktioniert nicht immer Java Basics - Anfänger-Themen 6
E Contain-funktion überlisten Java Basics - Anfänger-Themen 4
J Division ohne Arithmetische Funktion Java Basics - Anfänger-Themen 2
S Funktion in Klasse auslagern Java Basics - Anfänger-Themen 4
J Problem mit Boolean bei Funktion! Java Basics - Anfänger-Themen 5
S Gibt es eine Funktion, die gewissermaßen eine Reihe von instanceOf() vereinheitlicht? Java Basics - Anfänger-Themen 19
D Nullstellen einer Funktion 3. Grades mit Horner Schema Java Basics - Anfänger-Themen 6
Aprendiendo Gibt es in der JAVA-API eine Funktion, die eine Dezimalzahl in eine binäre Zahl umwandelt? Java Basics - Anfänger-Themen 8
D Funktion gibt Dimension zurück Java Basics - Anfänger-Themen 11
A Rekursion Funktion in eine Iterativ Funktion umwandeln Java Basics - Anfänger-Themen 9
T static String Variable wird nur beim ersten aufruf durch eine Funktion geändert. Java Basics - Anfänger-Themen 16
B Zugriffe in einer Klasse / Funktion Java Basics - Anfänger-Themen 9

Ähnliche Java Themen

Neue Themen


Oben