hei leute!
ich hab folgendes Problem und hoffe Ihr versteht meine Erklärung da des zum erklärn recht komplex is...
ich hab ne Klasse > DefaultClient in der die Methode > sendAndReceiveLine drinnen is
sendAndReceiveLine wird dafür verwendet um eine Socketverbindung mit einer SPS herzustellen und einen beliebigen String zu senden und gleichzeitig einen String zu empfangen.
weiters habe ich eine Klasse > ManuellGUI wo ich mit 10 verschiedenen Kanonen schiessen kann
wenn ich jetzt zb: bei Kanone 1 auf den Button Feuern drücke wird mittels > sendAndReceiveLine ein String gesendet damit die SPS weiß, dass sie den jeweiligen Ausgang setzen muss. Gleichzeitig kommt ein String zurück! entweder ERR, OFF, BSY oder die Geschwindigkeit
zusätzlich habe ich eine Klasse > MesswertlisteGUI in der mit F5 ein SwingWorker gestartet wird der alle Sekunden ebenfalls die Methode > sendAndReceiveLine aufruft, um wenn ein neuer Geschwindigkeitswert vorhanden ist, ein Objekt Kanone zu erstellen und das mit publish() und process() in eine JList zu schreiben!
mein Problem ist nun wenn ich in der Klasse > ManuellGUI auf den Button Feuern drücke und zufällig genau dann die Methode > sendAndReceiveLine aufgerufen wird wenn auch gerade der SwingWorker > sendAndReceiveLine aufruft bekomme ich eine Exception "readtimeout" und die Verbindung zur sps bricht ab und die SPS stürtzt auch ab -.-
jetzt wollte ich Euch fragen ob ihr mir sagen könnt wie ich das lösen könnte:
kann man beim SwingWorker prioritäten vergeben?
oder ist das mit einem SwingWorker gar nicht zu realisieren?
wollte an dieser Stelle auch gleich fragen ob es gut ist einen SwingWorker mittels for-schleife recht lange laufen zu lassen, so wie ich das bei meinem code habe?
hoffe ihr versteht mein Problem und könnt mir weiterhelfen!
Klasse: DefaultClient
Klasse: ManuellGUI
Klasse: MesswertlisteGUI
ich hab folgendes Problem und hoffe Ihr versteht meine Erklärung da des zum erklärn recht komplex is...
ich hab ne Klasse > DefaultClient in der die Methode > sendAndReceiveLine drinnen is
sendAndReceiveLine wird dafür verwendet um eine Socketverbindung mit einer SPS herzustellen und einen beliebigen String zu senden und gleichzeitig einen String zu empfangen.
weiters habe ich eine Klasse > ManuellGUI wo ich mit 10 verschiedenen Kanonen schiessen kann
wenn ich jetzt zb: bei Kanone 1 auf den Button Feuern drücke wird mittels > sendAndReceiveLine ein String gesendet damit die SPS weiß, dass sie den jeweiligen Ausgang setzen muss. Gleichzeitig kommt ein String zurück! entweder ERR, OFF, BSY oder die Geschwindigkeit
zusätzlich habe ich eine Klasse > MesswertlisteGUI in der mit F5 ein SwingWorker gestartet wird der alle Sekunden ebenfalls die Methode > sendAndReceiveLine aufruft, um wenn ein neuer Geschwindigkeitswert vorhanden ist, ein Objekt Kanone zu erstellen und das mit publish() und process() in eine JList zu schreiben!
mein Problem ist nun wenn ich in der Klasse > ManuellGUI auf den Button Feuern drücke und zufällig genau dann die Methode > sendAndReceiveLine aufgerufen wird wenn auch gerade der SwingWorker > sendAndReceiveLine aufruft bekomme ich eine Exception "readtimeout" und die Verbindung zur sps bricht ab und die SPS stürtzt auch ab -.-
jetzt wollte ich Euch fragen ob ihr mir sagen könnt wie ich das lösen könnte:
kann man beim SwingWorker prioritäten vergeben?
oder ist das mit einem SwingWorker gar nicht zu realisieren?
wollte an dieser Stelle auch gleich fragen ob es gut ist einen SwingWorker mittels for-schleife recht lange laufen zu lassen, so wie ich das bei meinem code habe?
hoffe ihr versteht mein Problem und könnt mir weiterhelfen!
Klasse: DefaultClient
Java:
public class DefaultClient
{
public DefaultClient()
{
}
public static String sendAndReceiveLine(String host, int port, String text)
throws Exception
{
InetAddress adress = InetAddress.getByName(host);
Socket socket = new Socket(adress,port);
socket.setSoTimeout(5000);
OutputStream os = socket.getOutputStream();
OutputStreamWriter ows = new OutputStreamWriter(os);
BufferedWriter bw = new BufferedWriter(ows);
bw.write(text);
bw.newLine();
bw.flush();
InputStream is = socket.getInputStream();
InputStreamReader isr = new InputStreamReader(is);
BufferedReader br = new BufferedReader(isr);
String antwort = br.readLine();
br.close();
bw.close();
return antwort;
}
}
Klasse: ManuellGUI
Java:
public class ManuellGUI extends javax.swing.JFrame
{
private StringZerlegung sz = new StringZerlegung();
private String[] feld = new String[20];
public int[] anzKugeln = new int[10];
private int[] zaehlerMagazin = new int[10];
MesswertlisteGUI mwListe;
public ManuellGUI()
{
initComponents();
super.setLocation(20, 100);
mwListe = new MesswertlisteGUI();
mwListe.setVisible(true);
}
private void onFire1(java.awt.event.ActionEvent evt)
{
try
{
if((anzKugeln[0]) != zaehlerMagazin[0])
{
String text = DefaultClient.sendAndReceiveLine("192.168.0.1",
11159,"online#1#0#0#0#0#0#0#0#0#0\0");
feld = sz.Geschw(text);
tfVKM1.setText(feld[1]);
zaehlerMagazin[0]++;
}
else
{
tfVKM1.setText("LEER");
}
}
catch(Exception e)
{
JOptionPane.showMessageDialog(this, e.getMessage(),"Fehler",JOptionPane.ERROR_MESSAGE);
}
// Konsolenausgabe zu Testzwecken
System.out.println("Taste Feuern 1 wurde gedrückt");
}
}
Klasse: MesswertlisteGUI
Java:
public class MesswertlisteGUI extends javax.swing.JFrame
{
public Kanonen kanonenModel = new Kanonen();
StringZerlegung sz = new StringZerlegung();
String[] htext = new String[20];
public double speed = 0.0;
public double speedold = 0.0;
public MesswertlisteGUI()
{
initComponents();
liListeMW.setModel(kanonenModel);
}
private class MySwingWorker
extends SwingWorker<Object, Kanone>
{
public MySwingWorker()
throws Exception
{
}
@Override
protected Object doInBackground()
throws Exception
{
for(int i=0; i<999; i++)
{
System.out.println("MW Liste: der " + i + ". durchlauf");
String text = DefaultClient.sendAndReceiveLine("192.168.0.1", 11159, "werte");
htext = sz.Geschw(text);
for(int a = 1; a < 11; a++)
{
String status = htext[a];
status = status.replace('.', ',');
System.out.println("MW Liste: prüfung");
if(status.equals("ERR") || status.equals("BSY") || status.equals("OFF") || status.equals("0"))
{
System.out.println("es wurde noch kein Objekt erzeugt");
}
else
{
System.out.println("MW Liste: einlesen der " + a + ". geschwindigkeit");
Scanner scan = new Scanner(status);
System.out.println("MW Liste: Scanner");
speed = scan.nextDouble();
if(speedold != speed)
{
speedold = speed;
System.out.println("MW Liste: erzeugen des " + a + ". Objekts");
Kanone kan = new Kanone(25, speed ,23.23);
publish(kan);
}
}
}
System.out.println("1sec warten");
Thread.sleep(1000);
}
return null;
}
@Override
protected void done() // wird automatisch aufgerufen
{
// super.done();
// Object object = get();
// holt Ergebnis von doInBackground
System.out.println("MW Liste: SwingWorker fertig\n");
}
@Override
protected void process(List<Kanone> chunks)
{
for(Kanone kan:chunks)
{
System.out.println("MW Liste: adden der Objekte");
kanonenModel.add(kan);
}
}
}
private void onAktualisieren(java.awt.event.ActionEvent evt)
{
MySwingWorker worker;
try
{
worker = new MySwingWorker();
System.out.println("Mw Liste: starten des SwingWorkers");
worker.execute();
}
catch (Exception e)
{
JOptionPane.showMessageDialog(this, "Fehler: " + e.getMessage());
}
}
}