while bzw. do-while Problem



  • also die sache mit equals(), before() und after() hab ich verstanden.

    von der Sache mit den Threads hab ich allerdings gar keine Ahnung bisher, kannst du mir das erklären?



  • Kann ich...

    Die Event-Query verarbeitet alle Ereignisse, so z.B. das Ereignis ActionPerformed bei Klick auf einen Button. Diese Ereignisse werden der Reihe nach durch die Event-Query abgearbeitet. Die Event-Query ist ein eigener Thread im Hintergrund. Wenn eine deiner Listener nun aber besonders lange arbeitet, dann werden die Ereignisse nicht schnell genug abgearbeitet und deine GUI reagiert nicht mehr. Typisches Symptom ist z.B. ein Button der bei einem Klick zwar "eingedrückt" wird, aber erst nach einigen Sekunden wieder "hervor" kommt.

    Ein Beispiel:

    public class Test extends JFrame implements ActionListener {
    
    	public static void main(String[] args) {
    		new Test();
    	}
    
    	public Test() {
    		JButton b=new JButton("Test");
    		b.addActionListener(this);
    		getContentPane().add(b, BorderLayout.CENTER);
    		setVisible(true);
    	}
    
    	public void actionPerformed(ActionEvent e) {
    		System.out.print("oh habe ich viel zu tun...");
    		for(int i=0; i<10; i++) {
    			try { Thread.sleep(500); } catch(Exception ex) {}
    			System.out.print('.');
    		}
    		System.out.print(" [done]\n");
    	}
    }
    

    Dieser Code funktioniert und ist auch "performant", allerdings wird der User eher das Gefühl bekommen das Programm sei langsam oder hätte sich gar aufgehängt. Um das Programm zu verbessern brauchen wir daher einen eigenen Thread. In diesem Code-Beispiel ist das nun ganz einfach zu lösen... ersetzen wir die actionPerformed-Methode durch folgende reagiert das Programm wie erwartet:

    public void actionPerformed(ActionEvent e) {
        new Thread(new Runnable() {
            public void run() {
                System.out.print("oh habe ich viel zu tun...");
                for(int i=0; i<10; i++) {
                    try { Thread.sleep(500); } catch(Exception ex) {}
                    System.out.print('.');
                }
                System.out.print(" [done]\n");				
        }}).start();
    }
    

    Zum weiterlesen empfehle ich das entsprechende Kapitel in der Java-Insel. 😉

    MfG,
    Hilefoks

    EDIT: Der Hinweis auf die Java-Insel ist dafür da das du dich etwas in Thread's einlesen kannst... bei Fragen werde ich die natürlich weiterhin beantworten. In der Insel würde ich dir besonders das Kapitel 9 empfehlen (wobei du nicht gleich alles verstehen musst).



  • 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 folgendes

    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)) {
                    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


Anmelden zum Antworten