Invalid Thread access

zerix

Hausmeister
Moderator
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.
Code:
if(e.getSource()==start)
{
    th=new MeinThread(list,browser);
    th.start();
}

Das ist die Variablendeklaration und der Konstruktor in meinem Thread.
Code:
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.
Code:
 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.

Code:
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
 
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
 
Da ich den Befehl nicht kenne, könntest du noch bitte ein kleines Beispiel bringen wo und wie man das einbaut?
 
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?
 
Hallo!

Code:
/**
 * 
 */
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
 
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
 
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
 
Zurück