Thread-Problem, glaube ich?

Status
Nicht offen für weitere Antworten.
G

Guest

Gast
Hallo Leute,
ich muss als Praktikum eine "Seilbahn programmieren" welche man mit Personen besetzen kann und angezeigt werden.
Soweit funktioniert auch alles, ausser dass es mir während des Threads-durchlauf nicht neu gezeichnet wird.
Nun hab ich eine innere klasse namens motor, welche die seilbahn bewegen sollte. Dies wird auch ausgeführt, wenn ich dies mittels einem system.out jeweils im Thread(schleife) ausgebe. Jedoch wird der repaint() im thread nicht ausgeführt.
Was könnte das sein?

Ich stelle mal den Code online , falls mir jemand helfen möchte, herauszufinden was es sein könnte, wäre echt nett!
(Interessant ist eigentlich nur die run() methode.

Code:
import java.awt.*;
import java.applet.*;
import java.awt.event.*;

public class Seilbahn extends Applet implements ActionListener,AdjustmentListener {
	
	/**
	 * Autor: Manuel Miklo
	 * Date: 23.4.08
	 * Version: 1.0
	 */
	private static final long serialVersionUID = 1L;
	private Gondel[] gondeln;
	private TextField txtein,txtaus;
	private Button neu,loeschen,ok;
	private Scrollbar einsteiger;
	private Label lblein;
	public static int id=0;
	
	private int seil_y_unten=350;
	private int seil_y_oben=50;
	private int abstand;
	private boolean running=false;
	private Thread motor;
	
	public void init(){	
		//Applet init
		setSize(1000,800);
		//Div. init
		gondeln=new Gondel[6];
		abstand=(int)(this.getWidth()/gondeln.length);
		//Gui
		txtein=new TextField(10);
		txtaus=new TextField(25);
		neu=new Button("Neu");
		neu.addActionListener(this);
		loeschen=new Button("Loeschen");
		loeschen.addActionListener(this);
		ok=new Button("einsteigen");
		ok.addActionListener(this);
		einsteiger=new Scrollbar(Scrollbar.HORIZONTAL,0,1,1,9);
		einsteiger.addAdjustmentListener(this);
		lblein=new Label(""+einsteiger.getValue());
		//Darstellen
		add(new Label("Gondelgrösse:"));
		add(txtein);
		add(new Label("Exception"));
		add(txtaus);
		add(neu);
		add(loeschen);
		add(new Label("Einsteigen:"));
		add(einsteiger);
		add(lblein);
		add(new Label("Person/en"));
		add(ok);	
		motor=new Thread(new Motor());
	}
	
    public void update(Graphics g) {
        paint(g);
      }
	
	public void paint(Graphics g){
		System.out.println("Hallo");
		abstand=(int)(this.getWidth()/gondeln.length);
		g.drawLine(0, seil_y_unten, this.getWidth(), seil_y_oben);
		for(int i=0;i<id;i++){
			gondeln[i].display(g);
			//System.out.println(gondeln[i].getPos()+"............");
		}

	}
	
	public void actionPerformed(ActionEvent e){
		if(e.getSource()==neu){
			txtaus.setText("");
			running=true;
			motor.run();
			if(id<gondeln.length){
				try{
					gondeln[id]=new Gondel(id,0*abstand,seil_y_unten,Integer.parseInt(txtein.getText()));
				}catch(NumberFormatException ne){
					txtaus.setText("Gondelgrösse eintragen(4/8)");
				}catch(UngueltigeGondelGroesseException ugge){
					txtaus.setText(ugge.getMessage());
				}
				if(gondeln[id]!=null) id++;	
			}
			else	txtaus.setText("Seilbahn gefüllt");
		}
		
		if(e.getSource()==loeschen){
			for(int i=0;i<gondeln.length;i++)	gondeln[i]=null;
			txtein.setText("");
			txtaus.setText("");
			id=0;
		}
		if(e.getSource()==ok){
			try{
				if(id==0) throw new KeineGondelException();
				gondeln[id-1].einsteigen(einsteiger.getValue());
			}catch(KeineGondelException kge){
				txtaus.setText(kge.getMessage());
			}catch(GondelBelegtException gbe){
				txtaus.setText(gbe.getMessage());
			}
		}
		repaint();
	}
	
	public void adjustmentValueChanged(AdjustmentEvent e){
		lblein.setText(""+einsteiger.getValue());
	}

class Motor implements Runnable{
	
	public Thread motor;
	
	@Override
	public void run() {
		int delta=1;
		int temp=0;
		while (running){
			
			if(Seilbahn.id>=1){
				while(temp<=abstand){
					for(int i=0;i<Seilbahn.id;i++){
						gondeln[i].setPos(delta,((seil_y_unten-seil_y_oben)*(double)delta)/getWidth());
										
						
					}
				System.out.println("sdf");
				repaint();	
				temp+=delta;
				try{
					Thread.sleep(150);
				}catch(InterruptedException e){
				}
				}	
			}
			running=false;
		}
		
	}
}

}

Ich bin am verzweifeln!!
Gruss 
Miklo
 
S

SlaterB

Gast
motor.run();
führt die run()-Operation ganz normal wie jede andere aus,
solange diese läuft, ist der Rest des Applets blockiert

den nebenläufigen Thread startest du mit
motor.start();
 
G

Guest

Gast
hallo slasterB,
danke für die schnelle antwort. Hab ich aber auch schon versucht. Wenn ich motor.start() verwende schiesst er mir eine Exception um die ohren.

Exception in thread "AWT-EventQueue-1" java.lang.IllegalThreadStateException
at java.lang.Thread.start(Unknown Source)
at Seilbahn.actionPerformed(Seilbahn.java:78)
at java.awt.Button.processActionEvent(Unknown Source)
at java.awt.Button.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)

irgendwas geht einfach schief.
Aber was..?
gruss
miklo
 
S

SlaterB

Gast
der Thread läuft schon/ ist schon beendet?
zweimal start() geht nicht, für jeden Durchlauf neues Thread-Objekt
 
G

Guest

Gast
Hallo.,
das erste ist mir geglückt...
hab mal ne witere Frage zu diesem Code. Wenn ich eine weitere Klass in der inneren Klasse schriebe , welche ein boolean zurückgibt, wie kann ich von nun vom applet her drauf zugreifen? Hab darum einen Status eingebaut, welcher solange die gondel nicht neu positioniert ist, true(Motor läuft) zuückgeben soll. Mittels motor.getStatus() geht das nicht.
Ich habe ja im Applet den Motor so initialisiert: Thread motor=new Thread(new Motor()) . Mein Problem ist einfach, dass, weil es ja jetzt ein parallel laufender Thread ist, mir die Gondel , welche erst neu im Gondel[] erstellt werden soll(new), wenn die alte Gondel bis zu ihrer neuen position vorgefahren ist. Poste einfach nochmals den aktuellen Code.
(Code, wo jene problemmethode ist (motor.getStatus())


Code:
import java.awt.*;
import java.applet.*;
import java.awt.event.*;

public class Seilbahn extends Applet implements ActionListener,AdjustmentListener {
	
	/**
	 * Autor: Manuel Miklo
	 * Date: 23.4.08
	 * Version: 1.0
	 */
	private static final long serialVersionUID = 1L;
	private Gondel[] gondeln;
	private TextField txtein,txtaus;
	private Button neu,loeschen,ok;
	private Scrollbar einsteiger;
	private Label lblein;
	public static int id=0;
	
	private int seil_y_unten=350;
	private int seil_y_oben=50;
	private int abstand;
	private boolean running=false;
	private Thread motor;
	
	public void init(){	
		//Applet init
		setSize(1000,800);
		//Div. init
		gondeln=new Gondel[6];
		abstand=(int)(this.getWidth()/gondeln.length);
		//Gui
		txtein=new TextField(10);
		txtaus=new TextField(25);
		neu=new Button("Neu");
		neu.addActionListener(this);
		loeschen=new Button("Loeschen");
		loeschen.addActionListener(this);
		ok=new Button("einsteigen");
		ok.addActionListener(this);
		einsteiger=new Scrollbar(Scrollbar.HORIZONTAL,0,1,1,9);
		einsteiger.addAdjustmentListener(this);
		lblein=new Label(""+einsteiger.getValue());
		//Darstellen
		add(new Label("Gondelgrösse:"));
		add(txtein);
		add(new Label("Exception"));
		add(txtaus);
		add(neu);
		add(loeschen);
		add(new Label("Einsteigen:"));
		add(einsteiger);
		add(lblein);
		add(new Label("Person/en"));
		add(ok);	
		
	}
	
	public void paint(Graphics g){
		abstand=(int)(this.getWidth()/gondeln.length);
		g.drawLine(0, seil_y_unten, this.getWidth(), seil_y_oben);
		for(int i=0;i<id;i++){
			gondeln[i].display(g);
		}

	}
	
	public void actionPerformed(ActionEvent e){
		if(e.getSource()==neu){
			txtaus.setText("");
			if(id>=1){
			running=true;
			motor=new Thread(new Motor());
			motor.start();
			}
			if(id<gondeln.length){
				try{
***************************************
					if(!motor.getStatus()) gondeln[id]=new Gondel(id,0*abstand,seil_y_unten,Integer.parseInt(txtein.getText()));
				}catch(NumberFormatException ne){
					txtaus.setText("Gondelgrösse eintragen(4/8)");
				}catch(UngueltigeGondelGroesseException ugge){
					txtaus.setText(ugge.getMessage());
				}
				if(gondeln[id]!=null) id++;	
			}
			else	txtaus.setText("Seilbahn gefüllt");
		}
		
		if(e.getSource()==loeschen){
			for(int i=0;i<gondeln.length;i++)	gondeln[i]=null;
			txtein.setText("");
			txtaus.setText("");
			id=0;
		}
		if(e.getSource()==ok){
			try{
				if(id==0) throw new KeineGondelException();
					gondeln[id-1].einsteigen(einsteiger.getValue());
			}catch(KeineGondelException kge){
				txtaus.setText(kge.getMessage());
			}catch(GondelBelegtException gbe){
				txtaus.setText(gbe.getMessage());
			}
		}
		repaint();
	}
	
	public void adjustmentValueChanged(AdjustmentEvent e){
		lblein.setText(""+einsteiger.getValue());
	}

class Motor extends Thread{
	
	boolean state;
	
	public boolean getStatus(){
		return state;
	}
	
	public void start(){
		motor=new Thread(new Motor());
		motor.run();
		state=true;
	}
	
	@Override
	public void run() {
		int delta=1;
		int temp=0;
		while (running){
			System.out.println("Hallo");
			if(Seilbahn.id>=1){
				while(temp<=abstand){
					for(int i=0;i<Seilbahn.id;i++){
						gondeln[i].setPos(delta,((seil_y_unten-seil_y_oben)*(double)delta)/getWidth());
										
						
					}
				repaint();	
				temp+=delta;
				try{
					Thread.sleep(30);
				}catch(InterruptedException e){
				}
				running=false;
				state=false;
				}	
				
			}
		}
	}
}

}
 
S

SlaterB

Gast
was mit deinen Gondeln los ist weiß ich nicht, aber um getStatus() aufzurufen musst du das Motor-Objekt irgendwo speichern und nicht direkt in einen Thread ablegen

speichere Motor unter
private Motor motor;
den Thread vielleicht noch unter
private Thread motorThread;
falls benötigt, wahrscheinlich brauchst du ihn gar nicht,

--------

die Operation

public void start(){
motor=new Thread(new Motor());
motor.run();
state=true;
}

in Motor kann komplett weg
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Thread-Schreibe-Lese-Problem Java Basics - Anfänger-Themen 4
S Compiler-Fehler Exception in thread "main" java.lang.Error: Unresolved compilation problem: Java Basics - Anfänger-Themen 6
A Problem mit Thread.sleep Java Basics - Anfänger-Themen 4
B Thread Problem Java Basics - Anfänger-Themen 7
G problem mit thread.sleep() Java Basics - Anfänger-Themen 6
T Problem mit Eclipse? Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 4
M Threads Thread.Sleep Problem im Zusammenhang mit GUI/ActionPerformed-Methode Java Basics - Anfänger-Themen 4
H Threads Problem bei Thread + Innere Klasse Java Basics - Anfänger-Themen 3
F thread problem Java Basics - Anfänger-Themen 3
D Problem mit interrupt() thread Java Basics - Anfänger-Themen 4
G Problem Thread und Monitoring Java Basics - Anfänger-Themen 3
P Problem beim Thread Java Basics - Anfänger-Themen 20
kulturfenster Problem mit Thread + Interface Java Basics - Anfänger-Themen 4
S problem mit repaint() in Thread Java Basics - Anfänger-Themen 6
M Thread - Problem Java Basics - Anfänger-Themen 3
A Problem zweitem Thread in Applet Java Basics - Anfänger-Themen 12
G Problem mit Thread Sleep! Java Basics - Anfänger-Themen 3
G Problem mit Thread Java Basics - Anfänger-Themen 6
G Thread Problem Java Basics - Anfänger-Themen 13
A Do/While Problem (Exception in thread "main" java. Java Basics - Anfänger-Themen 4
G Thread Problem Java Basics - Anfänger-Themen 2
P Problem mit Thread - cannot be referenced from a static cont Java Basics - Anfänger-Themen 5
H Problem mit einem Programmversuch (geteilter Thread) Java Basics - Anfänger-Themen 3
N Thread Problem. Java Basics - Anfänger-Themen 6
E Anfänger Problem mit Thread.sleep() Java Basics - Anfänger-Themen 11
D Thread und JOptionPane -> Problem Java Basics - Anfänger-Themen 6
D Thread Problem Java Basics - Anfänger-Themen 4
K Problem beim Einbau von einem Thread in eine Gui Java Basics - Anfänger-Themen 9
K animation in applet, thread problem (?) Java Basics - Anfänger-Themen 3
G Problem bei Thread im Frame Java Basics - Anfänger-Themen 3
G Problem mit Thread Java Basics - Anfänger-Themen 2
G Thread-Problem Java Basics - Anfänger-Themen 2
Leyla Thread isInterrupt Java Basics - Anfänger-Themen 18
P Meldung aus Java-Klasse in Thread an aufrufende Klasse Java Basics - Anfänger-Themen 1
A Thread XML-Dateien zusammenfügen Java Basics - Anfänger-Themen 11
F influxdb Upload in eigenem Thread Java Basics - Anfänger-Themen 2
frager2345 Thread - Methoden synchronized deklarieren Java Basics - Anfänger-Themen 10
berserkerdq2 Größter unterschied von extends thread und implements runnable? Java Basics - Anfänger-Themen 2
T Thread beenden aus zweiter Klasse Java Basics - Anfänger-Themen 4
A Thread - Synchronized Java Basics - Anfänger-Themen 10
A Thread Producer - Consumer Java Basics - Anfänger-Themen 1
A Thread-Semhapore Java Basics - Anfänger-Themen 0
A Thread Exchanger Java Basics - Anfänger-Themen 22
A Thread-Cyclicbarrier Java Basics - Anfänger-Themen 4
B In einem Thread Endlosschleife beenden Java Basics - Anfänger-Themen 19
A Thread-Verklemmung Java Basics - Anfänger-Themen 10
A Thread find number Java Basics - Anfänger-Themen 8
F Thread.sleep() Java Basics - Anfänger-Themen 5
F Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 11 at main.main(main.java:11) Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 3
M Exception in thread "main" java.util.NoSuchElementException Java Basics - Anfänger-Themen 2
A Thread Java Basics - Anfänger-Themen 8
B Compiler-Fehler Fehlermeldung Exception in thread, falsche Eingabewert Java Basics - Anfänger-Themen 2
M Thread-Zustände Java Basics - Anfänger-Themen 6
CptK For-Schleife in Thread nach jedem Durchlauf pausieren Java Basics - Anfänger-Themen 35
S Kriege Fehler "Exception in thread" beim Benutzen von SubStrings. Java Basics - Anfänger-Themen 2
B Endlosschleife Thread sauber beenden Java Basics - Anfänger-Themen 19
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 1
D Java Thread wartet nur ein mal Java Basics - Anfänger-Themen 0
O Exception in thread "main" java.lang.ArithmeticException: / by zero Java Basics - Anfänger-Themen 4
C Thread und TimerTask, Verstädnisproblem Java Basics - Anfänger-Themen 10
amgadalghabra Sorting Thread Launcher Java Basics - Anfänger-Themen 3
B Exception in thread "AWT-EventQueue-0" java.util.ConcurrentModificationException Java Basics - Anfänger-Themen 8
A Thread Java Basics - Anfänger-Themen 4
A Thread Java Basics - Anfänger-Themen 1
A Thread Java Basics - Anfänger-Themen 0
R Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 5
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 1
B Thread / Prozess stoppen? Java Basics - Anfänger-Themen 22
I Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 5 Java Basics - Anfänger-Themen 3
B Threads Thread sleep() Method einfache Frage Java Basics - Anfänger-Themen 8
W Thread Aufgabe - Vorgehensweise Java Basics - Anfänger-Themen 8
L Liste in anderem Thread laden Java Basics - Anfänger-Themen 0
J Threads PrograssBar update während thread Java Basics - Anfänger-Themen 13
D Compiler-Fehler Wert auf Datenbank übertragen und Sleep Thread Java Basics - Anfänger-Themen 3
Spencer Reid JavaFX Memory Thread.sleep Java Basics - Anfänger-Themen 1
S Thread.sleep mit JProgressBar Java Basics - Anfänger-Themen 1
ralfb1105 Frage zu Thread Synchronisation mit wait() und notify() Java Basics - Anfänger-Themen 3
R Exception in thread "main" java.lang.NullPointerException Java Basics - Anfänger-Themen 10
J JavaFX -> SocketIO -> Thread -> Update Label Java Basics - Anfänger-Themen 13
J Thread Handling Java Basics - Anfänger-Themen 9
C Thread in Methode + raus aus der Schleife Java Basics - Anfänger-Themen 10
E Threads Thread in While-Schleife nur einmal starten Java Basics - Anfänger-Themen 2
F Daten von Thread an den aufrufenden zurückgeben Java Basics - Anfänger-Themen 22
C Compiler-Fehler Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: 2 Java Basics - Anfänger-Themen 3
N KeyListener in Thread Java Basics - Anfänger-Themen 0
M Thread.sleep() Funktion Java Basics - Anfänger-Themen 1
W JLabel in Main aus Thread verändern. Java Basics - Anfänger-Themen 4
D Ausgeben welcher Thread gerade Arbeitet Java Basics - Anfänger-Themen 8
N Threads Thread-Fehler Java Basics - Anfänger-Themen 2
F Thread um Uhrzeit ausführen Java Basics - Anfänger-Themen 5
F Get/Post als eigener Thread mit Rückgabe Java Basics - Anfänger-Themen 5
J Exception in thread "main" Java Basics - Anfänger-Themen 1
F Thread der auf eine Queue wartet, sicher beenden Java Basics - Anfänger-Themen 4
B Animation mit Thread(s) Java Basics - Anfänger-Themen 23
I Thread.sleep (1000); Java Basics - Anfänger-Themen 1
M Threads Jede Klasse einem Thread zuweisen Java Basics - Anfänger-Themen 7
J Java Thread cancel() und wiederbeleben Java Basics - Anfänger-Themen 4
J BouncingBalls 1 Thread Java Basics - Anfänger-Themen 3
L Fehler: Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben