RCPThreadingTable of ContentsSwing und ThreadsFalls man mehrere Threads in seiner Anwendung verwenden will, sollte man immer die Single Thread Regel beachten:
Das Updaten eines Spwingelements in einem anderen Thread als dem event-dispatching Thread wird zu Problemen führen (Flackern oder sogar ein möglicher Deadlock...) Man muss die invokeLater(Runnable) oder die invokeAndWait(Runnable) Methoden der SwingUtilities Klasse nutzen um den Code in einem event-dispatching Thread laufen zu lassen. Wie auch immer, es gibt verschiedene Möglichkeiten Multithreading in Swingapplikationen transparent zu nutzen. SpinBeispiel für Spin
public interface JobListener
{
public void start();
public void end();
public void progress(int percentage);
}
public class Job extends TimerTask
{
private ListenerListHelper listeners = new ListenerListHelper(JobListener.class);
public void addJobListener(JobListener l)
{
listeners.add(l);
}
public void removeJobListener(JobListener l)
{
listeners.remove(l);
}
public void run()
{
listeners.fire("start");
...
listener.begin();
for (...)
{
...
listeners.fire("progress", new Integer(percentage));
}
...
listeners.fire("end");
}
}
public class TestView extends AbstractView implements JobListener
{
public void start() {
getStatusBar().setMessage("Begin"); // And/or other Swing stuff
}
public void end()
{
getStatusBar().setMessage("End"); // And/or other Swing stuff
}
public void progress(int percent)
{
getStatusBar().setMessage("Completed " + percent); // And/or other Swing stuff
}
protected JComponent createControl()
{
...
}
public class LongRunningCommand extends ActionCommand
{
public LongRunningCommand()
{
super("longRunningCommand");
}
protected void doExecuteCommand()
{
Job job = new Job();
// use the Spin.over functionality
job.addJobListener((JobListener) Spin.over(TestView.this));
// execute the job
...
}
}
}
Go to top
Edit this page.
More info...
Attach file...
This page last changed on 10-Nov-2006 14:27:27 CET by 88.198.0.236. |