[linux-l] Persistente Informationen mit Java Applets/Threads erzeugen und gezielt löschen: how to re-initialize an applet thread

Rocco Melzian Rocco.Melzian at TU-Berlin.de
Mo Jun 13 23:58:55 CEST 2005


Hallo,

ich habe mir heute vergeblich die Zähne an folgendem Problem ausgebissen:

Ich möchte folgendes implementieren:
*Lade beim Login eines Benutzer über ein HTML Formular ein Java Applet, was
einen Counter (verbleibende Zeit für Klausur) anzeigt.

*Von der Login Seite können die Nutzer zu verschiedenen anderen Seiten
navigieren, wobei immer der gleiche, rückwärts laufende Counter angezeigt werden
soll. Auch "Reload" soll den Counter nicht zurücksetzen.

*Nur wenn eine bestimmte Seite aufgerufen wird, dann soll der Counter wieder neu
initialisiert werden.

Ich wollte das Problem über Parameter an das Applet lösen:

<-- snip html seite die neu initialisieren soll-->
<applet code="Counter.class" archive="Counter.jar" height="15" width="400">
    <param name="reset" value="true" />
    <param name="max" value="90" />
</applet>
<-- snip-->

<-- snip html seite die NICHT neu initialisieren soll-->
<applet code="Counter.class" archive="Counter.jar" height="15" width="400">
</applet>
<-- snip-->

Jetzt habe ich mir das so gedacht: ich mache 2 Klassen, Counter und Uhrwerk. Der
Counter erzeugt sich eine Instanze vom Uhrwerk, von dem es aber nur eine Instanz
insgesamt geben kann (hatten wir neulich schonmal bei den Preferences und den
private Constructors). Diese statische Uhrwerk-Instanz merkt sich, wie weit sie
schon gezählt hat und zählt dann immer weiter runter. Setzt der Counter die
Variable "reset" des Uhrwerks auf true, dann wird neu initialisiert.

Interessanterweise funktioniert das Ändern mit dem max Parameter, der auch an
das Applet geschickt wird.

Entschuldigung für soviele Zeilen Code ... wie bringe ich den vom Counter Applet
gestarteten Uhrwerk-Thread dazu, eine neu Startzeit (start = new
GregorianCalendar()) auf Kommando ;-) einzulesen?

---------------------------------------------------------------------
public class Counter extends Applet implements Runnable {
...
public void init(){
    /*
    Beim ersten Laden des Applets wird ein Uhrwerk initialisiert, was sich selbst
    dann als Thread startet. Wenn es schon ein Uhrwerk gibt, dann wird dieses
    zurückgegeben
    */
    ecw=Clockwork.getClockwork();

    //set maximum minutes if available
    Integer m = Integer.valueOf(getParameter("max"));
    if(m.intValue() > 0){
      ecw.setMaxDelta(m.longValue());
    }
}

public void start(){
    //hier den parameter aus der html seite überprüfen
    if(getParameter("reset").equals("true"))
    {
      //das Uhrwerk stoppen
      ecw.setStop(false);		
      this.init();

      //---------------------------//
      //Und jetzt sollte eigentlich alles wieder bei Null anfangen,
      //tut es aber nicht
    }

    //start this thread
    counterThread = new Thread(this);
    counterThread.start();
   }

public void run(){
    while(okToRun == true)
    {
      repaint();
      try {
	Thread.sleep(timeStep);
          } catch (InterruptedException e) {}
    }
}
}

Wenn ich richtig gelesen habe, dann wird die init() methode beim ersten Laden
des Applets ausgeführt, danach nur noch start()

----------------------------------------------------------------
public class Clockwork implements Runnable {

    private static Clockwork ecw;

    private Clockwork(){
	  super();
	  init();
    }
	
    public void init(){
	reset 			= 	false;
	start 			= 	new GregorianCalendar();
	currentColour		= 	Color.black;
	counterThread 		= new Thread(this);
	counterThread.start();
    }

    public void run(){
      while(okToRun == true)
      {
        if(reset == true){
          init();
        }else{
          try {
         	Thread.sleep(timeStep);
          } catch (InterruptedException e) {}
        }
      }
    }

    public static ExamClockwork getExamClockwork(){
	if(ecw == null){
	  ecw = new ExamClockwork();
	  return(ecw);
	}else{
	  return(ecw);
	}
    }

    public void setStop(boolean r){
	okToRun = r;
    }
}

Das Problem is, dass ich das Uhrwerk nicht mehr neu initialisieren kann. Es 
muss auf jeden Fall "start" neu gesetzt werden. Hat
jemand von euch einen Tipp, wo der Haken an der Sache ist?

Vielen Dank
Rocco Melzian

Angehängt mal eine zip-Datei mit den benötigten Dateien.

-------------- nächster Teil --------------
Ein Dateianhang mit Binärdaten wurde abgetrennt...
Dateiname   : Counter.zip
Dateityp    : application/x-zip-compressed
Dateigröße  : 8806 bytes
Beschreibung: nicht verfügbar
URL         : <https://mlists.in-berlin.de/pipermail/linux-l-mlists.in-berlin.de/attachments/20050613/b3780540/attachment.bin>


Mehr Informationen über die Mailingliste linux-l