W
waste1
Gast
Hallo,
ich habe ein Problem mit Threads. Ich habe auch schon ein wenig hier rumgesucht, aber bin noch nicht fündig geworden. So hoffe ich, dass ihr mir weiterhelfen könnt.
Es wird einfach ein Textfeld und ein Button angezeigt.
In das Textfeld kann man hineinklicken, den Text markieren oder editieren. Soweit so gut. -> OK
Wenn man nun auf den Button klickt, soll im Textfeld der Text verändert und danach ein Thread gestartet werden. Das passiert auch. -> OK
Der Thread dauert 15 Sekunden. -> OK
nun mein Problem:
Während dieser Zeit (solange der Thread läuft) ist die Oberfläche nicht zu benutzen. Aber warum?
Warum blockiert der Thread den Rest? Oder besser, was mache ich genau falsch?
Ich dachte mit display.asyncExec(Thread) erreiche ich einen nebenläufigen Thread.
Ich hätte es gerne so, dass das Textfeld geändert wird, dann der Thread startet und während der Thread läuft sollte die Oberfläche weiter bedienbar sein. (hier also das Textfeld editierbar sein).
Hier mal der Beispielcode:
Ich danke euch schonmal fürs Lesen und für eventuelle Lösungen.
Ich hoffe wirklich, dass ihr mir helfen könnt.
Gruß
waste1
ich habe ein Problem mit Threads. Ich habe auch schon ein wenig hier rumgesucht, aber bin noch nicht fündig geworden. So hoffe ich, dass ihr mir weiterhelfen könnt.
Es wird einfach ein Textfeld und ein Button angezeigt.
In das Textfeld kann man hineinklicken, den Text markieren oder editieren. Soweit so gut. -> OK
Wenn man nun auf den Button klickt, soll im Textfeld der Text verändert und danach ein Thread gestartet werden. Das passiert auch. -> OK
Der Thread dauert 15 Sekunden. -> OK
nun mein Problem:
Während dieser Zeit (solange der Thread läuft) ist die Oberfläche nicht zu benutzen. Aber warum?
Warum blockiert der Thread den Rest? Oder besser, was mache ich genau falsch?
Ich dachte mit display.asyncExec(Thread) erreiche ich einen nebenläufigen Thread.
Ich hätte es gerne so, dass das Textfeld geändert wird, dann der Thread startet und während der Thread läuft sollte die Oberfläche weiter bedienbar sein. (hier also das Textfeld editierbar sein).
Hier mal der Beispielcode:
Code:
import org.eclipse.swt.SWT;
import org.eclipse.swt.layout.RowLayout;
import org.eclipse.swt.widgets.Button;
import org.eclipse.swt.widgets.Display;
import org.eclipse.swt.widgets.Event;
import org.eclipse.swt.widgets.Listener;
import org.eclipse.swt.widgets.Shell;
import org.eclipse.swt.widgets.Text;
public class SWTThreadTest extends Thread
{
private Thread t;
private Text text;
public static void main(String[] args)
{
new SWTThreadTest().start();
}
public void run()
{
final Display display = new Display();
Shell shell = new Shell(display);
text = new Text(shell, SWT.NONE);
text.setText("Noch geht alles. Man kann in diesen Text klicken und ihn markieren");
Button b = new Button(shell, SWT.PUSH);
b.setText("Klick");
b.addListener(SWT.Selection, new Listener()
{
public void handleEvent(Event e)
{
t = new Thread()
{
public void run()
{
try
{
Thread.sleep(10000);
}
catch (InterruptedException e)
{
e.printStackTrace();
}
text.setText("Der Thread ist beendet, markieren geht wieder");
}
};
text.setText("Hier ist alles blockiert :( ");
display.asyncExec(t);
}
});
shell.setLayout(new RowLayout());
shell.pack();
shell.open();
while (!shell.isDisposed())
{
if (!display.readAndDispatch())
display.sleep();
}
display.dispose();
}
}
Ich danke euch schonmal fürs Lesen und für eventuelle Lösungen.
Ich hoffe wirklich, dass ihr mir helfen könnt.
Gruß
waste1