TimerTask - Task stoppen - timer.cancel() funktioniert nicht

Status
Nicht offen für weitere Antworten.

armer Tropf

Mitglied
Hallo zusammen,

ich habe folgendes Problem. Ich führe einen Task aus, in dem z.B. GPS Daten ausgelesen werden. Die Ausführung startet, wenn ein bestimmter Befehl über den Com-Port gesendet wird. Das funktioniert so weit auch. Ich möchte nun aber genau diesen Task auch wieder stoppen, wenn ein bestimmter Befehl gesendet wird ("StopGPS"). Ich habe versucht dies mit timer.cancel() zu realisieren, aber leider funktioniert das nicht. Vielleicht kann mir jemand weiterhelfen oder hat Tipps für mich, was da nicht funktioniert. Ich hatte timer.cancel() auch schon in der run-Methode stehen, aber dann stoppt der Task direkt nach einmaligem auslesen von GPS-Daten. Ich möchte aber, dass der Task so lange ausgeführt wird bis ein Befehl gesendet wird. Wäre für jede Hilfe sehr dankbar.

Anbei ein bissel Code aus meinem Programm:

Code:
// Hier lese ich den Befehl ein und bestimme was passieren soll
public static void getCommand(StringBuffer command) {
        ...
        Timer timer = new Timer();
        if (command.toString().equalsIgnoreCase("startGPS")) {
	      getRMCData(timer);				
        } else if (command.toString().equalsIgnoreCase("stopGPS")) {
	      timer.cancel();
        }
        ...
}

// Task starten und alle 300ms ausführen...
public static void getRMCData(Timer timer) {
	timer.schedule(new TaskRMC(), 1, 300);
        ...
}


// GPS Daten holen...
public class TaskRMC extends TimerTask {
        public void run() {
              String replyRMC = GPSInterface.getInstance().requestRMC();
              ...
        }
}

Gruß Stephie
 

madboy

Top Contributor
Hi Stephi,

Das Problem wird sein, dass du eine andere Instanz von Timer canceln willst als die, in der die TimerTask läuft.

Code:
// Hier lese ich den Befehl ein und bestimme was passieren soll 
public static void getCommand(StringBuffer command) { 
        ... 
        Timer timer = new Timer();  //<-- Hier wird ein neuer Timer erstellt
        if (command.toString().equalsIgnoreCase("startGPS")) { 
         getRMCData(timer);             
        } else if (command.toString().equalsIgnoreCase("stopGPS")) { 
         timer.cancel();                       //<-- und hier wird der oben neu erstellte Timer gecancelt.
        } 
        ... 
}

Vorschlag:

Code:
...
private Timer timer = new Timer(); 
...

// Hier lese ich den Befehl ein und bestimme was passieren soll 
public static void getCommand(StringBuffer command) { 
        ... 
        if (command.toString().equalsIgnoreCase("startGPS")) { 
         getRMCData(timer);             
        } else if (command.toString().equalsIgnoreCase("stopGPS")) { 
         timer.cancel();                      
        } 
        ... 
}

Damit greifst du immer auf die gleiche Timerinstanz zu.

Gruß,
madboy

EDIT: so weit ich mich erinnere, lässt sich ein einmal gecancelter Timer nicht nochmal verwenden. Verwende lieber "deineTimerTask.cancel()".
 

armer Tropf

Mitglied
Hallo,

danke für deine Antwort.
Ja, auf den Haken bin ich auch grad gestoßen. Ich kann zar damit das Prozedere stoppen, aber wenn ich es wieder starten möchte bekomme ich die Meldung, dass der Timer bereits gestoppt wurde und daher nicht mehr verwendet werden kann :-(

Was meinst du mit "Verwende lieber "deineTimerTask.cancel()"."??

Stephie
 

madboy

Top Contributor
Hi,

Du verwendest folgendes, um eine neue Task zum Timer hinzuzufügen:
Code:
timer.schedule(new TaskRMC(), 1, 300);

Speichere die Tasks in einer Liste o.ä. So etwa:

Code:
...
private HashMap <String, TimerTask> timerTasks = new HashMap <String, TimerTask>();
...

// Task starten und alle 300ms ausführen... 
public static void getRMCData(Timer timer) { 
  TimerTask task = new TaskRMC();
   timer.schedule(task, 1, 300); 

  //id für jede Task festlegen
   timerTasks.put("taskid1", task);
        ... 
}

Dann kannst Du jede Task z.B. mit
Code:
  timerTasks.get("taskid1").cancel();
canceln.

Gruß,
madboy
 

armer Tropf

Mitglied
Hallo nochmal,

mit deinem Hinweis habe ich es mit einer Hashtable versucht, da es glaub bei J2ME keine HashMaps gibt?!

Code:
	public static void getRMCData(Timer timer, String command) {
		Hashtable timerTasks = new Hashtable();
		TimerTask taskRMC = new TaskRMC();
		
		if (command.toString().equalsIgnoreCase("startGPS")) {
			timer.schedule(taskRMC, 1, 300);
			timerTasks.put("1", taskRMC);
		} else if (command.toString().equalsIgnoreCase("stopGPS")) {
			timerTasks.remove("1");
			timerTasks.clear();
			
		}
	}

Wenn ich nun "stopGPS" als Befehl erhalte springt das Programm zwar in den entsprechenden Abschnitt (habe ich mit System.out.println() getestet ;-) ), aber leider passiert nach timerTasks.remove("1") und timerTasks.clear() nichts.

Sorry, vielleicht sitz ich auf dem Schlauch, aber was ist denn nun wieder falsch?!

Stephie
 

madboy

Top Contributor
Hi,

Code:
   public static void getRMCData(Timer timer, String command) { 
      Hashtable timerTasks = new Hashtable(); 
      TimerTask taskRMC = new TaskRMC(); 
       
      if (command.toString().equalsIgnoreCase("startGPS")) { 
         timer.schedule(taskRMC, 1, 300); 
         timerTasks.put("1", taskRMC); 
      } else if (command.toString().equalsIgnoreCase("stopGPS")) { 
         timerTasks.remove("1"); 
         timerTasks.clear(); 
          
      } 
   }
Hier ist das gleiche Problem wie vorher mit dem Timer. Du erstellst eine neue Hashtableinstanz und darin willst du was entfernen, was du vorher in eine andere Instanz gepackt hast.

Das
Code:
      Hashtable timerTasks = new Hashtable();
muss ausserhalb der Methode "getRMCData" stehen.

Ausserdem sollte vor dem timerTasks.remove() noch die Task gecancelt werden, also
Code:
timerTasks.get("1").cancel();
 

armer Tropf

Mitglied
Oh sorry, hab die falsche Version gepostet.
Also ich hab die Hashtable und auch den TimerTask außerhalb der getRMCData(), aber es funzt trotzdem nicht.

Und bei der Haschtable gibt es bei mir leider keine cancel(). Ich hab schon gesucht und find auch im Netz immer den Hinweise auf cancel(), aber kann es sein, dass es bei J2ME diese Funktion nicht gibt.
Den eigentlich zeigt Eclipse ja alle Möglichkeiten an?!
Daher habe ich gehofft, mit remove und clear ist es getan. Aber leider keine Reaktion..mein Task läuft ungestört weiter.


Danke.
 

madboy

Top Contributor
Und bei der Haschtable gibt es bei mir leider keine cancel().
Stimmt. Das cancel() ist nicht von Hashtable sondern von TimerTask.

Du musst also casten, falls aus der Hashtable nur Objekte (Typ Object) rauskommen:
Code:
...
         Object o = timerTasks.get("1");
         ((TimerTask) o).cancel();
         timerTasks.remove("1"); 
         timerTasks.clear();
...

Das
Code:
timerTasks.clear();
kannst übrigens weg lassen, dazu ist das
Code:
timerTasks.remove("1");
da.

Den eigentlich zeigt Eclipse ja alle Möglichkeiten an?!
So weit ich weiß, tut Eclipse das.

Zur Erklärung noch was:
Die Hashtable ist nur dazu da, dass die Instanz von TimerTask (vielmehr TaskRMC) gespeichert wird und du später noch darauf zugreifen kannst. Das ganze ist eigentlich nicht nötig wenn du nur eine TimerTask hast.

Ohne Hashtable würde es dann so ungefähr aussehen:
Code:
     private static TimerTask taskRMC =  null;
     
  public static void getRMCData(Timer timer, String command) { 
       
      if (command.toString().equalsIgnoreCase("startGPS")) { 
         taskRMC = new TaskRMC();
         timer.schedule(taskRMC, 1, 300); 
      } else if (command.toString().equalsIgnoreCase("stopGPS")) { 
          taskRMC.cancel();
      } 
   }

Gruß,
madboy
 

armer Tropf

Mitglied
Oh man, ich danke dir.
Ich hatte die ganze Zeit noch folgenden Fehler drin, weswegen es bei mir auch gar nie klappen konnte. Ich hab nicht in der getRMCData()

Code:
	taskRMC = new TaskRMC();

gemacht, sondern davor. Somit konnte ich natürlich nach dem canceln keinen neuen Task mehr ausführen.

Vor lauter Wald den Baum net gesehen.


Nochmals danke, war wirklich ne super Unterstützung von dir.

Schönes verlängertes WE.
Stephie
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N class Task extends TimerTask ohne Blockieren Allgemeine Java-Themen 15
M Verständnisfrage java.util.TimerTask Allgemeine Java-Themen 2
B TimerTask Allgemeine Java-Themen 1
L Missbrauch TimerTask? Allgemeine Java-Themen 2
U Timer - Timertask endet nicht Allgemeine Java-Themen 4
D Update von TimerTask Allgemeine Java-Themen 13
T [TimerTask] Pause Allgemeine Java-Themen 5
V Frage zu util.Timer (-> TimerTask) Allgemeine Java-Themen 2
K Scheduler und TimerTask Allgemeine Java-Themen 2
P Observer/TimerTask Allgemeine Java-Themen 3
G Mails aus TimerTask Allgemeine Java-Themen 6
O Timer und TimerTask: Programm terminiert nicht! Allgemeine Java-Themen 3
F Problem mit TimerTask Allgemeine Java-Themen 5
J Eine Frage zu den Threads und Task Allgemeine Java-Themen 1
S Java-Task-Management-Tool für Windows und Mac selber programmieren Allgemeine Java-Themen 4
J Probleme exe-Start mit Task Scheduler Allgemeine Java-Themen 1
Neumi5694 Task-Name unter Windows Allgemeine Java-Themen 4
K Multithreading: Service(Task), wait und continue Allgemeine Java-Themen 21
HarleyDavidson Tomcat VS Windows Scheduled Task Allgemeine Java-Themen 4
M Ant relative Pfade im Classpath vom Jar-Task Allgemeine Java-Themen 2
B Threads Main Thread warten auf abgebrochen Task warten lassen Allgemeine Java-Themen 25
A wie kann man Parameter an ein Task übergeben? Allgemeine Java-Themen 3
M Ant & javadoc-Task Allgemeine Java-Themen 1
R ANT Jar Task soll leere Verzeichnisse ignorieren..? Allgemeine Java-Themen 3
E Timer - gleichen Task mehrfach planen Allgemeine Java-Themen 2
G Task 1 sek nach letztem Tastendruck ausführen Allgemeine Java-Themen 2
M Java Programm als Windows XP - Task Allgemeine Java-Themen 9
D javaw.exe in task manager Allgemeine Java-Themen 6
B 24 Uhr Timer Task Allgemeine Java-Themen 5
C zyklisch Bsp. 1x pro Tag - morgens Task ausführen Allgemeine Java-Themen 14
J Timer-Objekt / Task-Zustand ermitteln Allgemeine Java-Themen 5
V Endlosschleife mit Startbutton starten und Stopbutton stoppen Allgemeine Java-Themen 6
E Exceptions abfangen und dann Programm stoppen - aber wie? Allgemeine Java-Themen 2
F ExecutorService sauber stoppen Allgemeine Java-Themen 8
V Thread schneller stoppen Allgemeine Java-Themen 2
G mehrere Threads starten/stoppen Allgemeine Java-Themen 4
O JFreeChart: ständiges Updaten der Chart stoppen Allgemeine Java-Themen 4
P Thread starten / stoppen / neustarten Allgemeine Java-Themen 8
E Durch System.in.read() blockierten Thread stoppen Allgemeine Java-Themen 10
L Thread stoppen über Button funktioniert nicht Allgemeine Java-Themen 7
B Scheduler soll bestimmten Job stoppen Allgemeine Java-Themen 4
M Thread aus anderer VM starten bzw. stoppen Allgemeine Java-Themen 7
G Thread stoppen Allgemeine Java-Themen 9
J Externes Programm starten und stoppen (Linux) Allgemeine Java-Themen 3
J zeit stoppen Allgemeine Java-Themen 11
C Thread stoppen und erneut starten Allgemeine Java-Themen 6
N Thread starten und Stoppen Allgemeine Java-Themen 14
J Thread stoppen Allgemeine Java-Themen 8
S methode stoppen / auf ein event warten Allgemeine Java-Themen 5
S blockierenden Prozess stoppen Allgemeine Java-Themen 13
F Dienst via Java Starten/Stoppen Allgemeine Java-Themen 10

Ähnliche Java Themen

Neue Themen


Oben