# Invalid Thread access



## zerix (9. Juni 2005)

hallo,

Ich hab mal auch wieder ein Problem  
Das Programm ist mit SWT geschrieben.
Hier lege ich ein Objekt von meinem Thread an und starte ihn. Übergabewerte sind eine Liste (mit Daten gefüllt)und einen Browser.

```
if(e.getSource()==start)
{
    th=new MeinThread(list,browser);
    th.start();
}
```

Das ist die Variablendeklaration und der Konstruktor in meinem Thread.

```
List list=null;
    Browser browser;
    
    Farmen(List list, Browser browser)
    {
        this.list=list;
        this.browser=browser;
      
    }
```

Das ist die einzige Methode die in run aufgerufen wird. Hier möchte ich einfach jedes element der liste abarbeiten.

```
private void MeineMethode()
	{
        
	    try{
	    for(int i=0;i<list.getSelectionCount();i++){
	        
	    list.setSelection(i);
	    browser.setUrl("http://tutorial.de");
	    System.out.println(list.getSelection()[0]);
	    Thread.sleep(10000);
	    }}
	    catch(Exception e)
	    {
	        e.printStackTrace();
	    }
	}
```


Mein Problem ist jetzt, dass ein Fehler kommt, sobald was mit der Liste oder dem Browser gemacht wird.


```
org.eclipse.swt.SWTException: Invalid thread access
	at org.eclipse.swt.SWT.error(SWT.java:2691)
	at org.eclipse.swt.SWT.error(SWT.java:2616)
	at org.eclipse.swt.SWT.error(SWT.java:2587)
	at org.eclipse.swt.widgets.Widget.error(Widget.java:381)
	at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:284)
	at org.eclipse.swt.browser.Browser.setUrl(Browser.java:1104)
	at MeinThread.MeineMethode(MeineKlasse.java:132)
	at MeinThread.run(MeineKlasse.java:128)
```

Der fehler kommt also bei _list.getSelectionCount()_. Mach ich das weg kommt der Fehler wenn ich das nächste mal was mit der Liste mache. Nehme ich die Liste ganz raus, ist das gleiche mit dem Browser.

Woran kann das liegen


----------



## Thomas Darimont (9. Juni 2005)

Hallo!

Wenn du in SWT von einem "anderen" Thread aus manipulationen an der GUI durchführen willst musst du dies über Display.getCurrent().asyncExec(Runnable r); bzw. syncExec(Runnable r) tun.

Gruß Tom


----------



## zerix (9. Juni 2005)

Da ich den Befehl nicht kenne, könntest du noch bitte ein kleines Beispiel bringen wo und wie man das einbaut?


----------



## zerix (9. Juni 2005)

Ich hab heute mal im Internet gesucht und hab nix gefunden wo das richtig erklärt wird.
Hab aber ein Beispiel gesehen, hab das aber nicht richtig verstanden. Soll ich den Thread jetzt weglassen?


----------



## Thomas Darimont (10. Juni 2005)

Hallo!


```
/**
 * 
 */
package de.tutorials;

import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.FillLayout;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Label;
import org.eclipse.swt.widgets.Shell;

/**
 * @author Tom
 * 
 */
public class SWTThreadAccessExample {

	/**
	 * @param args
	 */
	public static void main(String[] args) {
		final Display display = new Display();
		Shell shell = new Shell(display);
		shell.setText("SWTThreadAccessExample");
		shell.setLayout(new FillLayout());
		final Label label = new Label(shell, SWT.BORDER);
		label.setText(System.currentTimeMillis() + "");
		shell.pack();
		shell.open();
		new Thread() {
			public void run() {
				Runnable r = new Runnable(){
					public void run(){
						label.setText(System.currentTimeMillis() + "");
					}
				};
				while (true) {
					if (!label.isDisposed()) {
						//-> Exception in thread "Thread-0" org.eclipse.swt.SWTException: Invalid thread access
						//label.setText(System.currentTimeMillis() + "");
				
						display.asyncExec(r);
					} else {
						break;
					}

					try {
						sleep(100);
					} catch (InterruptedException e) {
						e.printStackTrace();
					}
				}
			}
		}.start();

		while (!shell.isDisposed()) {
			if (!display.readAndDispatch()) {
				display.sleep();
			}
		}
	}
}
```

Gruß Tom


----------



## zerix (10. Juni 2005)

Danke, das hat mir sehr geholfen


----------



## zerix (10. Juni 2005)

Jetzt hab ich ein anderes Problem.
Wie man oben sieht, möchte ich in einer for-schleife dir URL vom Browser ändern. Er ändert die URL aber nur einmal am ende des Threads.
Weiß jemand woran das liegt


----------



## zerix (13. Juni 2005)

Kann mir hiermit keiner helfen


----------



## Argui (7. Juni 2008)

Hi, ja der Thread is schon URALT, aber ich habe gerade das selbe Problem wie Sascha hier hatte.

Wenn ich beispielsweise in einem Thread:

browser.execute("irgendein script");
thread.sleep(5000);
browser.execute("noch ein script");

...ausführe, wird das erste browser.execute() nach dem thread.sleep() ausgeführt und das 2. Script direkt danach.

Mein Ziel war es, per Browser.execute() einen Link aufzurufen, dann zu warten bis der Link geöffnet wurde und dann weitere Scripte dort auszuführen. Jedoch klappt dies nicht, da das thread.sleep() zuerst ausgeführt wird.

Kann mir da vllt. wer helfen?

Grüße, Argui


----------



## zeja (7. Juni 2008)

Naja mit Thread.sleep legst du den SWT-Thread schlafen und somit wird das browser.execute erst nach dem sleep ausgeführt.

Was du möchtest ist aber eigentlich eine gewisse Zeit zu warten.

Mach dass doch mit einem Timer: http://dev.eclipse.org/viewcvs/inde...s/src/org/eclipse/swt/snippets/Snippet60.java


----------



## moertle (6. August 2008)

hab auch das Problem, jedoch will ich nur einen Timer in einem Label anzeigen lassen, welcher jede Sekunde refresht.

google weiss dazu auch nicht wirklich viel zu sagen, darum schreib ichs einfach mal hier rein in der Hoffnung, das jemand die Lösung kennt ;-)

Grüsse


----------

