while bzw. do-while Problem
-
ok, habe mich ein bisschen über threads informiert, erscheint mir auch alles recht verständlich.
Ich habe nun allerdings noch das Problem, dass folgendes nicht ausgeführt wird..
try { Runtime runt = Runtime.getRuntime(); if (weckzeit == uhrzeit) { runt.exec("D:/Winamp/winamp.exe"); } } catch (Exception x) { x.printStackTrace();
in meiner Prozessliste erscheint nur eine nbexec.exe die ziemlich viel Speicher frisst, aber Winamp wird nicht gestartet.
Den Befehl selbst hab ich auch schon über die Eingabeaufforderung getestet, da hat alles funktioniert.
-
if(weckzeit==uhrzeit) { ...
Ist niemals true, weil weckzeit und uhrzeit zwei verschiedene Objekte sind und daher die Referenzen auf die Objekte (was du hier vergleichst) auch niemals gleich sein können (dann wär es das gleiche Objekt). Was du aber möchtest ist ein "inhaltlicher" Vergleich - dazu musst du equals() und Co verwenden.
MfG,
Hilefoks
-
leider hat das mein problem nicht gelöst,
habe jetzt folgendesprivate void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { new Thread(new Runnable() { public void run() { Date weckzeit = new Date(); weckzeit.setHours(Integer.parseInt(jTextField1.getText())); weckzeit.setMinutes(Integer.parseInt(jTextField2.getText())); weckzeit.setSeconds(Integer.parseInt(jTextField3.getText())); while (uhrzeit.before(weckzeit)) { jLabel6.setText(weckzeit.toString()); } try { Runtime runt = Runtime.getRuntime(); if (weckzeit.equals(uhrzeit)) { runt.exec("D:/Winamp/winamp.exe"); } } catch (Exception x) { x.printStackTrace(); } }}).start(); }
Winamp wird immer noch nicht ausgeführt und nachdem die Weckzeit überschritten ist, steigt die Systemauslastung auf knapp 100%
-
private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { new Thread(new Runnable() { public void run() { Date weckzeit = new Date(); weckzeit.setHours(Integer.parseInt(jTextField1.getText())); weckzeit.setMinutes(Integer.parseInt(jTextField2.getText())); weckzeit.setSeconds(Integer.parseInt(jTextField3.getText())); while (uhrzeit.before(weckzeit)) { //Hier die aktuelle uhrzeit nachlesen jLabel6.setText(weckzeit.toString()); // Und ein Thread.sleep(200); oder so, dass nicht 100% CPU auslastung } try { Runtime runt = Runtime.getRuntime(); if (weckzeit.equals(uhrzeit)) { //Würde ich weg lassen, da es sehr unwahrscheinlich ist, dass beide gleich sind runt.exec("D:/Winamp/winamp.exe"); } } catch (Exception x) { x.printStackTrace(); } }}).start(); }
-
du hast immer noch unnötigen krams drin
das folgende ist keine komplettlösung sondern nur nen hinweis.
public void run() { while(uhrzeit.before(weckzeit)) { // nichts zu tun, legen wir den thread kurz schlafen try { Thread.sleep(1000); // eine sekunde } catch(Exception e) { } // exception behandlung is uns wurst ;) } // sobald der code hier ankommt, ist weckzeit überschritten! try { Runtime.getRuntime().exec("D:\Programme\Winamp\winamp.exe"); } catch(Exception e) { e.printStackTrace(); // hier nicht } }
-
Bitte nicht schlagen aber ich hab festgestellt, dass die Zeit in der Variable uhrzeit gar nicht aktualisiert wird sondern die ganze Zeit den Wert behält den sie bei der Erstellung bekommen hat.
Habe leider auch noch keine geeignete Funktion gefunden mit der ich die Uhrzeit aktualisieren kann.
-
ich glaub bei Date gab nen Konstruktor mit long. Also System.currentMilis, oder so ähnlich. Oder über Calendar.
-
artificial schrieb:
Bitte nicht schlagen aber ich hab festgestellt, dass die Zeit in der Variable uhrzeit gar nicht aktualisiert wird sondern die ganze Zeit den Wert behält den sie bei der Erstellung bekommen hat.
will ja keine erbsen zählen, aber lies die erste antwort nochmal
-
Wenn du ein Date Objekt erstellst wird es mit der aktuellen Uhrzeit initialisiert (solange du nicht explizit was anderes sagst). Natürlich aktualisiert sich das Objekt aber nicht selber. Als Lösung könntest du jetzt bei jeder iteration gegen ein neues Date Objekt prüfen... ist allerdings ziemlich unnütz und inperformant. Man kann aber auch einfach den Thread solange schlafen legen wie es sein muss... so etwa:
public void run() { if(weckzeit.getTime()>uhrzeit.getTime()) { try { Thread.sleep(weckzeit.getTime()-uhrzeit.getTime()); } catch(Exception e) {} } if(!Thread.interrupted()) { try { Runtime.getRuntime().exec("D:\Programme\Winamp\winamp.exe"); } catch(Exception e) { // Behandeln! } } else { // Was auch immer passieren soll wenn der Thread unterbrochen wurde. } }
MfG,
Hilefoks
-
Aber er holt sich doch auch hier nur mit getTime() den Wert der zur Zeit im Date-Objekt uhrzeit drin steht. Aktualisiert wird die Zeit leider nicht.
-
er hat aber keine while schleife