Nachträglich umgestellt auf zusätzlichen Thread

Status
Nicht offen für weitere Antworten.

Evolver

Bekanntes Mitglied
Gegeben ist ein Programm mit Swing-UI und einem Datenmodell, das zeitaufwendige Arbeit zu leisten. Dummerweise läuft diese Arbeit im selben Thread wie des UI, so dass für den Benutzer unter Umständen der Eindruck entstehen könnte, das Programm hätte sich aufgehängt.
Also wollte ich einen kleinen (modalen) Dialog mit einer Animation (z.B. ProgressBar) einfügen, der dem User verdeutlicht, dass das Programm bei der Arbeit ist, wobei im Hintergrund ungestört die Berechnung läuft. Ich habe mir das gleich folgende Vorgehen ausgedacht, um dies ohne Aufwand zu realisieren. Ich möchte wissen, ob das so vertretbar ist.

Code:
// Datenmodell-Beispiel
public class Model
{
	public static final long MIN = 0, MAX = Integer.MAX_VALUE;
	private long mValue;
	
	public Model()
	{
		mValue = MIN;
	}
	
	public void countUp()
	{
		while(mValue<MAX)
			++mValue;
	}
	
	public void countDown()
	{
		while(mValue>MIN)
			--mValue;
	}
}

Code:
// bearbeitetes Datenmodell
public class Model
{
	public static final long MIN = 0, MAX = Integer.MAX_VALUE;
	private long mValue;
	private DlgStatus mStatus;  // der Dialog mit Animation oder Darstellung des Fortschritts
	private Thread mWorkerThred;   // in diesem Thread soll die Arbeit ausgeführt werden
	
	public Model()
	{
		mValue = MIN;
		mStatus = new DlgStatus(null);
	}
	
	public void countUp()
	{
		mWorkerThred = new Thread(new Runnable()
			{
				public void run()
				{
					while(mValue<MAX)
						++mValue;
					mStatus.hideDialog();
				}
			});
		mWorkerThred.start();
		mStatus.showDialog();
	}
	
	public void countDown()
	{
		mWorkerThred = new Thread(new Runnable()
			{
				public void run()
				{
					while(mValue>MIN)
						--mValue;
					mStatus.hideDialog();
				}
			});
		mWorkerThred.start();
		mStatus.showDialog();
	}
}

Also funktionieren tut es, die Frage ist, ist es OK oder sollte ich es anders machen? (ggf.: Wie?)
 
N

naja

Gast
Das dein Model direkt das UI anspricht ist schon mal nicht so gut. Besser über Listener oder so.
 

Wildcard

Top Contributor
1. Was Gast sagt
2. Swing ist nicht threadsafe. Du musst also mit dem EventDispatcher synchronisieren (SwingUtilities#invokeLater) wenn du die Oberfläche direkt oder indirekt veränderst.
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben