probleme mit asyncExec

schuetzejanett

Erfahrenes Mitglied
Hallo,

ich wollte in meiner gui (login dialog) bei Klick auf den ok button testen ob der name in der datenbank vorkommt , und dann einige daten abrufen die ic später in meinem programm benötige, da diese abfragen einige zeit benötigen, möchte ich eine progressbar sichtbar machen und darüber einen statustext der sagt was aktuell passiert, also z.b. namen werde geprüft oder daten werden geladen.
Dafür haeb ich mit asyncexec einen thread gestartet in dem die progressbar sichtbar gemacht, der statustext geändert und die abfragen ablaufen. :?

Da ich noch nicht alle a3 bfragen fertig habe und mein chef aber etwas sehen will, habe ich erstmal 2 testfunktionen (fakkultätberechnung - soll Rechenzeit simulieren) eingefügt.

Beimablauf des threads wird die statusleiste auch sichtbar und ändert den text, die progressbar(indeterminate) aber wird zwar sichtbar, ändert sich aber nur nach ablauf einer abfrage. und auch sonst ist die gui blockiert.

was muss ich anders machen, damit die gui nicht blockiert ist und meine progressbar die ganze zeit läuft?

Hier mein code



Code:
private boolean loadDetails()
	{
				labelState.setText("name und Passwort werden geprüft");	
				Display.getDefault().asyncExec(new Runnable() {
					public void run() {
						progressBar.setVisible(true);
						progressBar.update();		
							long fakultaet = 1; 
				        for (int i=1; i<=10000; i++) {
				        	fakultaet = fakultaet * i;
				        	System.out.println(""+fakultaet);
				        } 
				                   
						labelState.setText("daten werden geladen");
						Preferences pref = Preferences.getInstance();
						fakultaet = 1; 
				        for (int i=1; i<=10000; i++) {
				        	fakultaet = fakultaet * i;
				        	System.out.println(""+fakultaet);
				        } 
						labelState.setText("daten  geladen");
						progressBar.setVisible(false);
						
						}
					});
				

	return true;
	}
 
Wichtig ist sich klar zu machen dass es in SWT nur einen Thread gibt der auf die GUI zugreifen kann. Mit asynExec bzw syncExec übergibt man aufzuführenden Code an diesen GUI Thread. Während der Ausführung dieses Codes kann also ansonsten nichts mehr mit der GUI passieren, sprich sie kann blockieren wenn der an asyncExec übergebene Code sehr lange Laufzeit hat. Daher führ deinen Code in einem eigenen Thread aus und benutze in diesem Thread dann ein asyncExec um auf die progressbar zuzugreifen.
 
hallo,

habe mir das bsp angesehen, steh aber immer noch ein bisschen auf dem schlauch.
Weil in embsp nehmen sie ja eine progressbar mit smooth und setzen ein maximum dann wird eine schleife durchgeführt und in der schleife die progressbar geändert.

Aber da ich ja nicht weiß wielang meine aufrufe dauern wollte ich halt gern eine Progressbar mit indeterminate also die immer weiter läuft. Und ich habe ja auch keine schleife.

Kann mir jemand mal ein kurzes codebsp schreiben an dem man das sieht, wie man drei aufrufe(was das ist ist ja erstmal egal) ausführt und während der abarbeitung die progressbar läuft
 
Nimm den Code den du im asynExec stehen hast und packe ihn in einen Thread.

Java:
Thread t = new Thread("ProgressWatch"){
public void run(){
....dein Code....
}
};
t.start();

Und nur die Aufrufe für progressBar.setVisible etc packst du in diesem Thread in das asyncExec

Java:
Thread t = new Thread("ProgressWatch"){
public void run(){
Display.getDefault().asyncExec(new Runnable() {
					public void run() {
						progressBar.setVisible(true);
						progressBar.update();		
}});
....weitererer Code....
}
};
t.start();
 
Hallo danke habe es hinbekommen,

Gibt es vielleicht noch die möglichkeit nach jedem aufruf den statustext zu ändern oder viel wichtiger, wie kann ich die statusleiste wieder unsichtbar machen. egal wo ich es einsetze entweder sie wird zu früh unsichtbar oder gar nicht

Hier erstmal mein code
Für 2 der drei aufrufe habe ich den thread schlafen lassen weil die noch nicht fertig sind

Code:
private boolean loadDetails() {

		Thread t = new Thread() {
			public void run() {
				

				try {Thread.sleep(1000);}catch (InterruptedException e) {}
				System.out.println("fertig(1)");
				Preferences pref = Preferences.getInstance();
				try {Thread.sleep(1000);}catch (InterruptedException e) {}
				System.out.println("fertig2");			

				Display.getDefault().asyncExec(new Runnable() {
					public void run() {
						progressBar.setVisible(true);
						progressBar.update();
						
					}
				});
			}
		};
		t.start();
		
		return true;
	}
 
Zurück