# Programm pausieren



## ankmanu (11. Feb 2010)

Hi,

habe folgendes Problem:
Ich will mein Programm anhalten, wenn ein Button gedrückt wird. Wenn dieser dann erneut gedrückt wird, soll das Programm wieder weiterlaufen.

Wie geht das, denn mit

```
try{
Thread.sleep(zeit_in_millisekunden);
}
catch(Exception e){}
```
kann ich das Programm ja nur für eine vorbestimmte Zeit anhalten??

Vielen Dank im Vorraus

manu


----------



## Cola_Colin (11. Feb 2010)

Was tut dein Programm den so ? D.h. welche Aktion soll pausiert werden ?
Eventuell hilft dir das hier weiter ?


----------



## ankmanu (11. Feb 2010)

Hi,

es soll einfach der ganze Thread pausiert werden, und wenn der Button erneut gedrückt wird, soll es weitergehen 

manu


----------



## hemeroc (11. Feb 2010)

Es kommt dabei aber durchaus darauf an was dein Thread eigentlich macht. Je nach dem sind vielleicht andere Methoden geeignet.
Dennoch hier eine kleine Idee:


```
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;


public class SleeperFrame extends JFrame {
	
	private static final long serialVersionUID = 2685140782562499729L;
	private Sleeper sleeper = new Sleeper();
	
	public SleeperFrame() throws InterruptedException {
		super("SleeperFrame");
		this.setLayout(new GridLayout(2,1));
		this.setDefaultCloseOperation(DO_NOTHING_ON_CLOSE);
		this.setResizable(false);
		this.setLocationRelativeTo(null);
		JButton wakeup = new JButton("Wake me up.");
		wakeup.addActionListener(new ActionListener() {
			
			@Override
			public void actionPerformed(ActionEvent arg0) {
				SleeperFrame.this.sleeper.wakeup();
				SleeperFrame.this.dispose();
			}
		});
		this.add(new JLabel("You have 10 seconds to wake me up!"));
		this.add(wakeup);
		this.pack();
		this.setVisible(true);
		sleeper.start();
		// ich weiß schon, das is unsauber aber es dient ja auch nur zur Veranschaulichung beider Fälle
		Thread.sleep(10000);
		sleeper.interrupt();
		this.dispose();
	}
	
	public static void main(String[] args) throws InterruptedException {
		new SleeperFrame();
	}
}

class Sleeper extends Thread {

	private boolean _sleep = true;
	
	public void wakeup() {
		this._sleep = false;
		this.interrupt();
	}
	
	@Override
	public void run() {
		try{
			while(this._sleep )
				Thread.sleep(Long.MAX_VALUE);
		} catch (InterruptedException e) {
			;
		} finally {
			if (this._sleep)
				JOptionPane.showMessageDialog(null,"Automatic wakeup initiated: you fail ^^","Error",JOptionPane.ERROR_MESSAGE);
			else
				JOptionPane.showMessageDialog(null,"Everything is ok.","Error",JOptionPane.INFORMATION_MESSAGE);
		}
	}
	
}
```

LG Hemeroc

Edit: diese Lösung basiert auf der sleep Methode meiner Meinung nach schöner ist für den Anwendungsfall allerdings wait. Ohne zu wissen was genau dein Programm tut kann ich allerdings nicht mehr für dich tun.


----------



## ankmanu (12. Feb 2010)

danke,

aber kann man das ganze nicht einfach so machen?


```
Object[] options = {"Weiter"};
JOptionPane.showOptionDialog(null, "Programm ist pausiert...", "Pause",
JOptionPane.DEFAULT_OPTION, JOptionPane.WARNING_MESSAGE,null, options, options[0]);
```

man muss davor natürlich javax.swing.JOptionPane; importieren.

Hält dann das Programm nicht an, bis "Weiter" gedrückt wird?

Viele Grüße
manu


----------



## hemeroc (12. Feb 2010)

Das zeigt dir nur ein Fenster an, das sagt, dass das Programm pausiert ist.
Allerdings hält das kein einen Thread nicht an. Wenn es der einzige Thread ist der läuft und auf die bestätigung gewartet wird dann wird natürlich nicht weitergearbeitet bis OK gedrückt wird.
Allerdings ist es sehr unüblich das ein Programm aus nur einem Thread besteht. Wie gesagt, sag uns was du machen möchtest dann können wir dir weiterhelfen. Ohne nähere Informationen kann ich dir nicht sagen was du machen musst.
LG


----------



## ankmanu (12. Feb 2010)

Hi,

ok, dann hier mal die Erklärung:

Zuerst wird ein JFrame mit Buttons, Labels, Textfields etc. erzeugt.
Wenn man nun auf den Button 'Start' drückt, wird von einer handelsüblichen Webcam ein Bild aufgenommen und dieses ausgewertet(nach bestimmten rgb-werten). 
Nun wird ein selbstgebauter Roboter so gesteuert, dass er etwas greift, nämlich das, was im Bild der Webcam(diese ist über dem Roboter) einen bestimmten rgb-wert hat.

Das Auswerten des Bildes und die positionierung des Roboters dauern seine Zeit, deshalb ist ein 'Notaus'-Button erforderlich, falls doch was schief  läuft(z.B. das jemand den Roboter behindert). 
Wen dieser Button gedrückt wird, soll zuerst der Thread einfach angehalten werden(logisch, eben ein Notaus ). Wenn man nun erneut auf den Button drückt, soll aber am besten die Aktion, die gerade dran st, fortgesetzt werden.

Geht sowas überhaupt??
Wenn nicht, dann wird der Thread ja sowieso angehalten, wenn der Button gedrückt wird, aber es kann eben nicht weitergehen !

Viele Grüße

manu


----------

