Thread soll Counter in GUI aktualisieren -- Counter bleibt stehen

RipdEaTh

Mitglied
Hi Leute!

Da bin ich wieder und bring wieder ein Problem mit :D

Folgendes:
Ich habe eine Shell, darin sind 6 Label. 3 davon dienen nur als Bezeichner, die 3 anderen repräsentieren Werte.
Die ersten beiden Labels davon ändern sich einmal bzw. zweimal.
Das 3. Label allerdings ist der besagte Counter.

Das ganze sieht wie folgt aus: Der Counter soll hochzählen, wieviele SQL Anweisungen erfolgreich durchgeführt worden sind. Die Ausführung der SQL Anweisungen läuft bereits als Thread und in diesem gibt es eine Variable, welche immer um eins hochgezählt wird.. Soweit so gut...

Nun habe ich aber das Phänomen, dass der Counter mal problemlos durchläuft, meistens aber mitten drin, so vor den ersten tausend Anweisungen, sich "aufhängt", das Programm selbst aber weiterläuft. Erst nachdem die Anweisungen alle abgearbeitet sind (es sind ca. 26000 Stück), dann aktualisiert er den Counter auf den Endstand und das Programm reagiert wieder. In seltenen Fällen beginnt der Counter auch garnicht erst zu zählen ^^

Das ganze habe ich n bisschen blöde umgesetzt, hab bisher allerdings noch nicht über eine andere Möglichkeit nachgedacht. Wenn der Thread selbst das Label ändern soll, gibts allerdings eine Exception.

Anbei mal der Code:
Hiermit wird der Thread gestartet..
Java:
	private void startCopy() {
		String[] connection = parentGUI.getConnection().split(";");
		bOK.setEnabled(false);
		
		lStatusValue.setText("working...");	
		HKStart hk = new HKStart(this, connection);
		
		while (!hk.finished) {
			try {
				Thread.sleep(500);
				setCopied(refresh.eintraege);
			} catch (InterruptedException ie) { }
		}
		
		bOK.setEnabled(true);
		lStatusValue.setText("finished");
	}


Diese Klasse repräsentiert den Thread..
Java:
 public class HKStart implements Runnable {
	private CreateHK ivGUI;
	private OPTerminTool conn;
	private Thread runner;
	public boolean finished = false;
	
	public HKStart(CreateHK inGUI, String[] connection) {
		ivGUI = inGUI;
		
		if (runner == null) {
			conn = new OPTerminTool(connection[0].split(":")[0], Integer.parseInt(connection[0].split(":")[1]), connection[1], connection[2], connection[3]);
			ivGUI.setEntries(conn.hauskatalogRows());
			runner = new Thread(this);
			runner.start();
		}
	}

	public void run() {
		conn.hauskatalog(ivGUI);
		finished = true;
	}
}


Und diese Methode führt die SQL Anweisungen durch.. Der Counter ist als Instanzvariable deklariert und public, damit die Shell drauf zugreifen kann..
Java:
	public boolean hauskatalog(CreateHK inGUI) {
		finished = false;
		boolean retVal = false;
		Random zufall = new Random(System.currentTimeMillis());
		String sql;
		
		inGUI.refresh = this;
		
		if (checkConnection()) {
			sql = "Insert into hauskatalog (HAK_OPA_ID, HAK_DAUER_SN_1, HAK_DAUER_SN_2, HAK_DAUER_SN_3, HAK_SAALENTSORGUNG, HAK_RUESTZEIT, HAK_NARKOSEZEIT, HAK_REINIGUNG, HAK_OPA_OPS, HAK_OPA_BEZEICHNUNG, HAK_OPA_BESCHREIBUNG, HAK_SCHLAGWORT, HAK_HYGIENE, HAK_IUSER, HAK_UUSER, HAK_UDATE) values (?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)";
			dbConn.createPreparedStatement(sql);
			
			try {
				while (ivResult.next()) {
					if (!(dbConn.checkIfExists("Select HAK_ID from hauskatalog where HAK_OPA_ID = '" + ivResult.getString(1) + "'"))) {
						dbConn.setStatement(1, ivResult.getString(1));				// OPA ID
						dbConn.setStatement(2, "" + zufall.randomInt(20, 69));		// SN1
						dbConn.setStatement(3, "" + zufall.randomInt(70, 119));		// SN2					
						dbConn.setStatement(4, "" + zufall.randomInt(120, 169));	// SN3
						dbConn.setStatement(5, ivResult.getString(2));				// SAALENTSORGUNG
						dbConn.setStatement(6, "" + zufall.randomInt(5, 15));		// RÜSTZEIT
						dbConn.setStatement(7, "" + zufall.randomInt(10, 20));		// NARKOSEZEIT
						dbConn.setStatement(8, ivResult.getString(3));				// REINIGUNG
						dbConn.setStatement(9, ivResult.getString(4));				// OPA_OPS
						dbConn.setStatement(10, ivResult.getString(5));				// OPA_BEZEICHNUNG
						dbConn.setStatement(11, ivResult.getString(6));				// OPA_BESCHREIBUNG
						dbConn.setStatement(12, ivResult.getString(7));				// SCHLAGWORT
						dbConn.setStatement(13, ivResult.getString(8));				// HYGIENE
						dbConn.setStatement(14, "8");								// IUSER
						dbConn.setStatement(15, "8");								// UUSER
						dbConn.setStatement(16, "0000-00-00 00:00:00");				// UPDATE
						
						if (dbConn.write())  {
							eintraege++;
						}
					}
					retVal = true;
				}
			} catch (Exception e) {
				//Logger.log(e.getMessage().toString());
				ivErrorMsg = "Fehler beim Verarbeiten der MySQL Daten";
			} finally {
				finished = true;
				//ivGUI.finished = true;
			}
		}
		return retVal;
	}


Ich hoffe, ihr könnt mir vll. ne bessere Lösung zeigen bzw. mir n Tipp geben und mir sagen, warum der Thread sich so komisch verhält.

Liebe Grüße,
Flo
 
Hallo!

Die Aktualisierungen von Swing-Komponenten aus einem anderen Thread as dem EDT (Event Dispatch Thread) müssen über den EDT geschleust werden. Das macht man beispielsweise so:

anstatt:
Java:
...
setCopied(refresh.eintraege);
...

Java:
final XXX refresh = ....
    ...
    EventQueue.invokeLater(new Runnable(){
      public void run() {
            setCopied(refresh.eintraege);
      }
    }));

Gruß Tom
 
Hallo!

... das war leider aus deinem Post nicht ersichtlich...
Ja... so ähnlich...
Java:
Display.getCurrent().asyncExec(new Runnable(){
      public void run() {
       //... 
      }
    }));

Gruß Tom
 
Hi Tom,

das habe ich bereits schonmal ausprobiert gehabt und es hat leider genau den selben Effekt gehabt.. Der Counter zählt meistens (nicht immer) und hängt sich sehr oft irgendwo im hunderter-Bereich auf..
 
Zurück