# Anzeige wärend des Ausführens eines Statements



## delphiking1980 (1. Mrz 2011)

Hallo,

nachdem ich jetzt meinen Zugriff auf die DB fertig habe wollte ich wenn der Benutzer einen Upload macht eine Anzeige erstellen (JFrame mit Progressbar) aber wie bekomme ich herraus ob der vorgang noch läuft ?

Ich habe nicht immer eine ID die ich in ganz bestimmten intervallen abrufen könnte.

MfG 

Delphiking1980


----------



## SlaterB (1. Mrz 2011)

was ist denn allgemein ein 'Vorgang'? wie meinst du das mit der Id, einfach nur eine Idee oder gibts da konkreten Hintergriund?

allgemein dürfte es in einem Java-Programm doch Java-Code (X) geben, der einen oder mehrere DB-Zugriffe ausführt,

dieser Java-Code X könnte vorher/nachher Zustandsvariablen setzen, die ein anderer paralleler Thread oder wer auch immer abfragt, 
darüber erfährt, ob X noch läuft,
je nach Genauigkeit gar vielleicht wieviel schon geschafft ist (etwa wieviele Durchläufe einer Schleife über 10.000 Elemente)


----------



## delphiking1980 (1. Mrz 2011)

Sorry, aber komme da nicht ganz mit.
Der Ablauf ist ja nicht syncron d.h. ich gebe das Statement ab und die Anwendung läuft weiter oder ?


----------



## SlaterB (1. Mrz 2011)

ich weiß nicht worum es in deinem Programm überhaupt geht, was du da machst, 
ob du normale JDBC-SQL-ResultSet-DB-Anfragen stellst 
(die bezeichne ich als synchron, wie soll man mit dem ResultSet etwas machen wenn das Programm nicht auf das Ende der Query wartet?!)
oder nur anderen Programmen Start-Befehle gibst, dann könnte ich deine Zweifel eher nachvollziehen


----------



## delphiking1980 (2. Mrz 2011)

Also ich mache ein SELECT,INSERT bzw UPDATE auf eine Tabelle und bei einem SELECT könnte man das ja abfragen ohne probleme aber bei einem INSERT bzw UPDATE wird das wohl schwieriger oder ?


----------



## SlaterB (2. Mrz 2011)

jedes dieser JDBC-Kommandos ist synchron, wenn eine komplexe Datenabfrage 5 sec dauert,
dann bleibt der zugehörige Java-Code eben 5 sec an der Zeile
> ResultSet rs = statement.executeQuery(..); 
stehen


----------



## delphiking1980 (2. Mrz 2011)

Nur bekomme ich bei einem Insert/Update kein ResultSet zurück sondern ein Integer mit einem Status ob dieser erfolgreich war.

Ich habe aber ein PreparedStatement.


----------



## SlaterB (2. Mrz 2011)

ResultSet  vs Integer ist gewiss ein Detail, welches ich nicht extra unterscheiden wollte,
dennoch die gleiche Situation: synchrone Abfrage, 
ob PreparedStatement oder normales Statement macht da auch keinen Unterschied,
kannst du auch alles testen?

ist in absehbarer Zeit eine Frage zu erwarten?
hatte im vorherigen Post erst schon gemeckert, aber da hatte ich deins falsch gelesen und dann editiert


----------



## delphiking1980 (2. Mrz 2011)

Meine Frage lautet eigentlich: Ist es möglich ein JFrame solange anzuzeigen wie die Query benötigt um auszuführen ?


----------



## SlaterB (2. Mrz 2011)

siehe meine erste Antwort, hinterer Teil, worauhin du das ganze auf 'nicht synchron' gelenkt hattest,
naja, Beschwerde bringt wohl nix

wenn noch was unklar ist und du die Hoffnung noch nicht aufgegeben hast, dass ich es beantworten kann  ,
dann mach mal weiter, in welcher Form auch immer, 
vielleicht melden sich ja auch andere

edit:
dass ein Teil der Anwendung sich mit der Datenbank beschäftigt, während ein anderer Teil, etwa die GUI, asynchron weiterläuft,
ist natürlich richtig, auch die JProgressBar wäre asynchron zum DB-Teil innerhalb der Java-Anwendung,
geht es dorthin?


----------



## delphiking1980 (2. Mrz 2011)

Ja genau das wollte ich hören,

habe das jetzt mit einem Thread probiert welchen ich vor dem statement.execute() starte und danach stoppe.


----------



## henpara (3. Mrz 2011)

```
protected Object doInBackground() throws Exception {
		at.start();
		tt.start();
		at.join();
		tt.join();
```
hab das auch mal gebraucht (progress-bar, die anzeigt daß ein längerer thread noch am arbeiten ist).
der at-thread macht die arbeit, der tt-thread macht die gui-updates.

Ist mich sicherheit nicht die optimale Lösung, funktioniert aber.


----------



## delphiking1980 (3. Mrz 2011)

Ja genau so etwas mache ich auch nur wie Stoppe ich den Thread ?

t.stop();

gibt es ja aber das Stoppt mir nur den Thread aber die JFrame bleibt immernoch erhalten.
Gibt es eine möglichkeit mit Stoppen des Threads auch die GUI zu schließen ?

Normalerweise treibt man einen Thread ja in den Selbstmord.


```
class Test implements Runnable {

private JFrame frame;
public Test(){
this.frame = new JFrame();
}

@Override
public void run (){
frame.show();
}

public void close(){
frame.dispose();
}
```

so ist ungefähr mein Ansatz.


----------



## henpara (3. Mrz 2011)

Warum willst du den Thread stoppen?

Ich bin so vorgegangen in meinem Gui-UpdateThread:

```
public void run() {

			int val = go.Go.mtxf.getPb().getValue();

			while (val <= max) {
				try {
					Thread.sleep(500);
				} catch (InterruptedException e) {
					// TODO Auto-generated catch block
					e.printStackTrace();
				}
				++val;
				//System.out.println(val);
				gu.setVal(val);
				SwingUtilities.invokeLater(gu);
				if (val==max) {
					val=0;
				}
				if (at.isAlive()==false) {
					return;
				}
			}
		}
```

Das ist zwar nicht synchronisiert, und im Prinzip könnte es auch schiefgehen, aber bisher funktioniert es ohne Probleme, wollte die beiden Threads zwar zuerst synchronisieren, hatte dann aber nicht die Zeit dazu, mich einzulesen.


----------

