Thread beenden

Status
Nicht offen für weitere Antworten.

MScalli

Bekanntes Mitglied
Habe ne kleine Klasse die mir während nem Druck der länger dauert ein kleines Fenster anzeigt.
jetzt will ich wenn der Druck fertig ist diesen Thread schliessen, nur bekomme ich das irgendwie nicht hin.
kann mir bitte mal wer helfen.
hier mein code.

Code:
import java.awt.Container;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JProgressBar;

public class InProgress extends JFrame implements Runnable{

private static final long serialVersionUID = 2861030250112241612L;
private static JProgressBar progress;
   int min=0;
   static int max=50000000;
   int val=0;
   Thread thread;

   public InProgress(String document){
      setTitle( "Bitte Warten... " );
      setUndecorated(true); //Rahmen weg machen
      progress = new JProgressBar();
      progress.setMinimum(min);
      progress.setValue(val);
      progress.setMaximum(max);
      //label = new JLabel("Bitte Warten... Der Report wird erstellt");
      
      //JLabel tmp = new JLabel(new ImageIcon(document + "wait.gif"));
      JLabel tmp = new JLabel("<html><h3>[b]Druck läuft. Bitte warten!![/b]</h3></html>");
     
      Container content = getContentPane();
      content.setLayout( new GridBagLayout() );

      content.add( tmp, new GridBagConstraints( 0, 0, 1, 1, 1.0, 1.0,
            GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
            new Insets( 2, 2, 2, 2 ), 0, 0) );

	start();

    pack();
    setLocationRelativeTo( null );
    
    setVisible( true );
   }

   protected void start(){
      new Thread( this ).start();
   }
   public void stop(){
	   System.out.println("STOP");
	   // also hier müsste der Thread beendet werden. mit stop gehts nicht!!
   }
   public void run(){
   }
   public static void ende(){
   }
}
 
die run-Operation ist leer, der Thread ist sowieso nach einer Nanosekunde zu Ende,

willst du das InProgress-JFrame beenden?
das hat mit dem Thread wenig zu tun,
this.dispose()
wäre der passende Befehl
 
Du deklarierst zwar einen neuen Thread "thread", aber erstellst keine Instanz davon.
Mit "new Thread" erstellst du zwar eine Instanz, kannst aber auf diese nicht zugreifen.

Also musst du wahrscheinlich vor die Instanzierung mit "new Thread( this ).start();" noch ein "thread =" stellen.

Also so:

Code:
protected void start(){ 
      thread = new Thread( this ).start(); 
}

Dann solltest du den Thread auch über "thread" stoppen können, falls er sich nicht wie SlaterB geschrieben hat von selbst wieder beendet.
 
Körby hat gesagt.:
Dann solltest du den Thread auch über "thread" stoppen können, falls er sich nicht wie SlaterB geschrieben hat von selbst wieder beendet.

Aber bitte nicht über Thread.stop(). Diese Methode ist unsicher, kaputt und deswegen deprecated.
 
also ne instanz erstellen ok

Code:
   protected void start(){
      thread = new Thread();
      thread.start();
   }

aber wie kann ich dispose z.B. in der Methode Stop verwenden..
wenn ich den Thread z.B. nach 5 sekunden zu mache geht das einwandfrei mit dispose.. z.B. so am ende des Programms

Code:
.
.
    try {
		thread.sleep(5000);
	} catch (InterruptedException e) {
		// TODO Auto-generated catch block
		e.printStackTrace();
	}
	dispose();

aber ich will ihn beenden wenn ich fertig bin(es wird ein Viewer aufgerufen)

Ich würd ja sagen ich beende am schluss einfach das Programm mit System.exit(0).. dann wär der Thread auch weg
dann habe ich aber das prob das mein Viewer auch mit zu geht 😉

mein Ziel ist es ein bitte warten fenster bis zum beenden des Programms anzuzeigen..
evtl geht das auch einfacher.. ????
 
deine dispose() methode killt ja auch das aufrufende fenster, du solltest schon versuchen die instanz thread zu beenden.

hast du dir das :

http://www.galileocomputing.de/openbook/javainsel6/javainsel_09_001.htm

mal angeschaut?

außerdem, was slaterB mit der leeren run methode meinte, du ruftst zwar thread.start() auf, aber der eigentliche code wird innerhalb des threads in der run methode ausgeführt, also kommt dort der code rein, der im thread abgearbeitet werden soll
 
Schon ein paar mal 🙁 bekomms aber nicht hin.

eigentlich will ich doch nur beim starten meines Programms nen Thread aufrufen der ein fenster aufmacht in dem Bitte Warten steht.
und wenn mein Programm durchgelaufen ist soll dieser beendet werden!!

wenn der Viewer nicht offen bleiben müsste wärs ja kein prob, denn dann könnt ich ein System.exit(0) ans ende hängen und es wär erledigt.
 
Fenster öffnen sollte möglich sein:

Einfach in der Methode run ein neues JFrame erzeugen, welches nur aus einem JTextField besteht. Das JTextField erhält dann bei der Inizialisierung den Text "Bitte warten...".
Anstelle von JTextField könntest du ein JLabel oder JTextArea verwenden, musst halt schauen, was sich am besten eignet.

Das JFrame bleibt dann solange offen, bis der Thread beendet wird.

Das JFrame sollest du dann beenden lassen, wenn das Programm am ende ist.
JFrame sollte sich mit dispose() beenden lassen. Wenn JFrame beendet wird, hat die Methode run keinen auszuführenden Code mehr und der Thread sollte sich von selbst beenden.
 
das ganze hat wirklich nichts mit Threads zu tun,
welche Aufgabe soll dem Thread bei dem ganzen zufallen?

soll das Start-Frame nach 4.7 Sekuden geschlossen werden?
dann ist ein Thread die richtige Wahl, dann kommt in run() Thread.slee(4700) und danach das dispose,

dagegen:
soll das Start-Frame nach einem Mausklick oder einem interen Ereignis (z.B. andere GUI fertig) geschlossen werden?
dann muss von diesem Ereignis ausgehend der Thread informiert werden, so dass dieser das Start-Frame schließt?
quatsch, stattdessen könnte von diesem Ereignis aus direkt das Start-Frame geschlossen werden, ein Thread ist hier ohne Funktion
 
natürlich muss kein thread sein, denn in seinem fenster "tut" sich ja nicht, es sei denn er will eine laufschrift oder drei punkte (..) die sich im fenster bewegen, oder halt ne progressbar.

aber wenn er einen will, kann er doch einen haben 🙂
 
ich weiss das es ohne Thread geht.. so habe ich es auch jetzt gemacht.

ich will das schon ewig mal ausprobieren denn(wie atze schon richtig gesagt hat) hab ich da was mit ner ProgressBar ist halt nur fertiger code.
Ich wollt des jetzt einfach mal von grund auf machen denn ich werde in nächster zeit bestimmt wieder mal was mit Threads zu tun haben, und das bring ich einfach net so hin das ichs kapiere.
deswegen wollte ich mal ganz klein anfangen und das so mal in die birne kriegen 😉

habe jetzt ein ganz normales Fenster gemacht und mach das am schluss zu..
mich würds aber immer noch interessieren wie ich das mit nem Thread lösen könnte..
denn das kommt ganz sicher wieder 🙁
 
was genau soll denn der Thread können?
von Zauberhand selber erraten, wann "m[d]ein Programm durchgelaufen ist "?

woher kommt diese Info, das musst du als erstes klären,
entweder schaut der Thread alle 200ms irgendwo nach oder jemand trägt die Info von außen heran,
dann muss der Thread eben nachschauen, ob sich sein interner Zustand geändert hat,

wenn man diese Taktik festgelegt hat, kann man langsam mit programmieren anfangen,
Thread.sleep() fürs warten, ne while-Schleife usw.,
hast du Fragen dazu oder was genau ist noch das Thema?
Beispiele gibts doch sicherlich in Lehrbüchern
 
arbeite auch mit einem Thread.
habe ein fenster, wo ich auf einen button klicke, worauf sich ein neues fenster öffnet.
in diesem neuen fenster kann man auch auf einen button klicken und es schließt sich wieder, somit ist man wieder bei dem ausgangsfenster.
problem ist nur, dass ich jetzt das gleiche fenster nicht nochmal öffnen kann.
hatte auch irgendwie gelesen, dass man threads nur einmal benutzen kann.
wer hat dazu eine lösung?
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben