SWT i nie wyłączający się TIMER

0

Siemka
Tak jak w temacie, piszę w SWT i mam procedurę:

public void odswiezanie() throws Exception {
		int delay = 5000; // delay for 5 sec.
	    int period = 1000; // repeat every sec.
	    Timer timer = new Timer();							

	    timer.scheduleAtFixedRate(new TimerTask() {
	      public void run() {
	        System.out.println("test"); 
              // WartoscOdebrane.setText("");
	       // pobierz_wiad();
	      }
	    }, delay, period);
	    
  }

Uruchamiam ją zaraz po starcie okna i wszystko ładnie działa do momentu gdy zamykam program. Okna już nie ma ale timer nadal działa i wyrzuca "test" w konsoli. Wiem, że mogę zrobić timer.cancel(); ale gdzie to dopisać żeby się wykonało przy zamykaniu programu (okna) na X w prawym górnym rogu? ;p
Z samym wyświetlaniem "test" timer działa natomiast gdy chcę wykonać procedurę pobierz_wiad(); i wyczyścić WartoscOdebrane.setText(""); wszystko się sypie...

1

Podczep pod okno: WindowListener
Wtedy masz metody do wykorzystania:

@Override
public void windowClosed(WindowEvent e) {

}

@Override
public void windowClosing(WindowEvent e) {

}
0

Rozwiązałem problem wyłączania timera tak:

cpowloka.addListener(SWT.Close, new Listener() {
		      public void handleEvent(Event event) {
		        timer.cancel();
		      }
		    });

Natomiast przy próbie wywołania procedury w timerze dostaję taki błąd:

org.eclipse.swt.SWTException: Invalid thread access
	at org.eclipse.swt.SWT.error(Unknown Source)
	at org.eclipse.swt.SWT.error(Unknown Source)
	at org.eclipse.swt.SWT.error(Unknown Source)
	at org.eclipse.swt.widgets.Widget.error(Unknown Source)
	at org.eclipse.swt.widgets.Widget.checkWidget(Unknown Source)
	at org.eclipse.swt.widgets.Text.setText(Unknown Source)
	at GUI.Chat.pobierz_wiad(Chat.java:213)
	at GUI.Chat$2.run(Chat.java:93)
	at java.util.TimerThread.mainLoop(Timer.java:512)
	at java.util.TimerThread.run(Timer.java:462)

Jeszcze nie ogarnąłem wątków dlatego proszę.
Co może wywoływać błąd? Jak to naprawić? ;)

EDIT

Znalazłem chyba rozwiązanie http://www.vogella.com/articles/EclipseJobs/article.html http://wiki.eclipse.org/FAQ_Why_do_I_get_an_invalid_thread_access_exception%3F jednak nie wiem jak to zastosować. Próbuję metodą prób i błędów ale nie działa.
Pomoże ktoś?

EDIT2

Problem rozwiązany.

public void odswiezanie() throws Exception {
		int delay = 5000; // delay for 5 sec.
	    int period = 5000; // repeat every sec.
	    timer = new Timer();							/// DO ZROBIENIA !

	    timer.scheduleAtFixedRate(new TimerTask() {
	      public void run() {
	    	  
	    	  Display.getDefault().syncExec(new Runnable() {
				  public void run() {
					  //System.out.println("test"); 
				       WartoscOdebrane.setText("");
				       pobierz_wiad();
				  }
				});
	        //
	      }
	    }, delay, period);    
	  }

1 użytkowników online, w tym zalogowanych: 0, gości: 1