Christoph: Eine Sekunde warten

Hi zusammen!

Ich hab mir ein Java-Applet zusammengebastelt.
In diesem Applet läuft eine unendliche Schleife.
Normalerweise wird die ja ziemlich oft pro Sekunde ausgeführt, ich hätte es aber lieber, dass die genau einmal pro Sekunde ausgeführt wird.
Im Prinzip müsste da eine Art wait-Methode rein.

Gibt es sowas? Kann mir jemand helfen?

  1. Probier mal so was:

      
    public class waittest  
    {  
     public static void main(String[] args)  
     {  
      System.out.println("Warte jetzt...");  
      
      try  
       {  
        Thread.sleep(5000);  
       }  
      catch(InterruptedException e)  
       {  
        System.out.println("Sleep Interrupted");  
       }  
      
      System.out.println("Fertig mit warten");  
     }  
    }  
    
    
    1. Klappt!

      Hatte den Code auch bei meiner Suche gefunden, dachte aber der wär nur für Threads.

      Jetzt kommt aber das nächste Problem:
      Wenn ich den Kram öffne, steht 5 Sekunden lag "Applet loaded." da. Erst nach 5 Sekunden erscheint dann der Text "Fertig mit warten". Die anderen Ausgaben waren gar nicht zu sehen.
      Wichtig ist, dass ich mit einem TextArea arbeite.
      Ich muss also irgendwie diese Ausgabe erzwingen.
      In VisualBasic geht das mit "do events".

      Geht das irgendwie auch mit Java?

      1. Hi,

        Geht das irgendwie auch mit Java?

        in VB geht das auch nur, weil du gewissermaßen dem Event-Handler deine Thread-Zeit abtrittst. Ich fürchte, das musst du in Java von Hand anstoßen, d.h. einen Thread abspalten für die langsame Verarbeitung und den Hauptthread für die Applet-Interaktion freihalten.

        MfG
        Rouven

        --
        -------------------
        Let Bygones Be Bygones  --  Robert Pitscottie: "Chronicles of Scotland"
        1. Huuuuh da überforderst du mich!

          Ich war ja schon froh, dass ich endlich Informatik für dieses Schuljahr abwählen konnte. Unser Lehrer konnte nämlich reden und reden aber nicht erklären.

          Ich weiß jetzt absolut nicht, was ich machen soll...

          1. Hello,

            Ich weiß jetzt absolut nicht, was ich machen soll...

            ja das ist in der tat ein ziemlich leidiges kapitel und gleichzeitig der grund, warum sich programmierung von eclipse-basierten Anwendungen gerade so als Trend entwickelt - die Gesamtumgebung nimmt einem schon viele Themen ab, die sonst Kopfzerbrechen bereiten.
            Wenn du eine konstant ansprechbare Anwendung haben willst, dann brauchst du einen Thread der die Verarbeitung macht und einen Thread der konstant ansprechbar ist bzw. z.B. den Bildschirmaufbau vornimmt aber mit der aufwändigen Berechnung nix zu tun hat.
            Aber sag mal, hattest du das Problem mit der fehlenden Anzeige den vor dem sleep nicht?

            MfG
            Rouven

            --
            -------------------
            Eine Bilanz ist wie der Bikini einer Frau. Sie zeigt fast alles, aber verdeckt das Wesentliche  --  Günter Stotz, Regierungsdirektor des baden-württembergischen Wirtschaftsministeriums
            1. Hi

              Also wenn die while-Schleife läuft, egal ob mit oder ohne sleep, dann macht der erst ne Ausgabe, wenn die Schleife zu Ende ist.
              Ich vermute - wie du bereits erwähnt hast - das der ganze Prozess für eine Ausgabe einfach viel zu schnell ist und der keine Zeit für die Ausgabe hat.

              Ich werd mal schaun, was ich so mit den Threads machen kann.
              Also muss ich praktisch 2 Threads haben: Der eine gibt 1-mal pro Sekunde einen Befehl an Thread 2. Thread 2 macht daraufhin die Ausgabe. Richtig???

              Christoph

              1. Hi,

                Ich werd mal schaun, was ich so mit den Threads machen kann.
                Also muss ich praktisch 2 Threads haben: Der eine gibt 1-mal pro Sekunde einen Befehl an Thread 2. Thread 2 macht daraufhin die Ausgabe. Richtig???

                ja, wobei - Namen sind Schall und Rauch - es könnte leichter sein, wenn Thread 2 die Befehle gibt und Thread 1 die Ausgabe machst, d.h. die Berechnung wird rausgeschält in einen eigenen Thread und der "Hauptthread" läuft weiter an der Oberfläche angedockt.

                MfG
                Rouven

                --
                -------------------
                Death is nature's way of telling you to slow down.
                1. hi,

                  ich probiers mal.
                  hab mir mal die informatik blätter vom letzten schuljahr rausgesucht.
                  danke für die tipps!

                  christoph

      2. Hallo,

        Hatte den Code auch bei meiner Suche gefunden, dachte aber der wär nur für Threads.

        Es laufen immer mehrere Threads in einer VM. Mindestens der Thread, in
        der deine Haupt-Applikation läuft (Main-Thread) und dann der Thread mit
        dem Garbage Collector.
        Alle Thread-Klassen und -Methoden kannst du daher auch dann einsetzen,
        wenn du nicht explizit mit Threads arbeitest. Der Main-Thread deiner
        Applikation ist ja immer vorhanden.

        Den aktuellen Thread kriegst du über diese statische Methode raus:
          Thread.currentThread()

        Da du jetzt gerade Applets schreibst, also grafisch programmierst, bist
        du aber ohnehin multithreaded, da insbesondere Events im sogenannten
        Event-Dispatch-Thread abgearbeitet werden. (Wenn du nicht weißt, was
        das ist, dann solltest du ggf. googeln oder eines der (ggf. kostenlosen)
        Bücher danach befragen.)

        Jedenfalls werden in der Zeit, in der du gerade einen Event verarbeitest,
        keine weiteren Events mehr ausgeliefert. Da aber auch Zeichenanforderungen
        etc. über den Event-Dispatch-Thread laufen, werden diese solange nicht
        ausgeführt, wie du in deiner Event-Behandlungsmethode hängst.

        Jetzt kommt aber das nächste Problem:
        Wenn ich den Kram öffne, steht 5 Sekunden lag "Applet loaded." da. Erst nach 5 Sekunden erscheint dann der Text "Fertig mit warten". Die anderen Ausgaben waren gar nicht zu sehen.

        Weil du vermutlich in einer Event-Behandlungsmethode diese 5 Sekunden
        wartest und daher jede andere Event-Verarbeitung blockierst. Erst nach
        den 5 Sekunden wird die Methode beendet und es können weitere Events, z.B.
        für Grafikoperationen abgearbeitet werden.

        Ich muss also irgendwie diese Ausgabe erzwingen.
        In VisualBasic geht das mit "do events".

        Geht das irgendwie auch mit Java?

        Nicht so direkt, nein. (VB funktioniert intern auch etwas anders als Java. :-))

        Ich weiß nicht so genau, was du vorhast. Soll der Inhalt der TextArea
        einfach jede Sekunden erneuert werden?
        Dann könntest du eine der beiden Timer-Klassen verwenden. Oder du startest
        einen neuen Thread, der jede Sekunde Änderungen an der TextArea vornimmt.
        Den prinzipiellen Code hast du ja schon. Jetzt mußt du das ganze
        nur noch in einen Thread einbinden und diesen starten. Wie das geht, steht
        in jedem Java-Buch beschrieben. Das ist alles kein Hexenwerk. :)
        Oder du fragst bei Bedarf einfach nochmal hier.

        Gruß
        Slyh