Guten Tag,
ich schreibe derzeit an einem Programm, welches Nachrichten über die Netzwerkschnittstelle an einen NetIO sendet. Der NetIO antwortet bzw. sendet je nach Anfrage einen String mit unterschiedlichem Inhalt zurück.
Ein Thread sendet Permanent Anfragen um Analogwerte abzufragen. Ein anderer Thread sendet "gleichzeitig" den Befehl zum Ein- und Ausschalten eines Digital-Ports. Hierbei kommen sich beide Threads in die Quere, denn sie greifen beide auf diesselbe Methode, zum Senden der Daten, zu! Sie erwarten aber jeweils einen anderen Wert ("setPort()" erwartet ein "ACK" und "getADC()" einen Wert zwischen 0 und 1023). Das geht leider regelmäßig schief.
Wie schaffe ich es, die einzelnen Threads (die bei mir einzelne Klassen sind) zu synchronisieren? Ich habe schon ein wenig über "sychronized" gelesen. Kann ich beispielsweise ein Objekt erzeugen und den beiden Threads im synchronized-Aufruf mitgeben? Regelt Java dann von selbst, wann welcher Thread auf die Methode(n) in der main-Klasse zugreifen darf und wartet ab bis diese ihre Antwort vom NetIO erhalten hat. Oder gibt es eine andere Möglichkeit?
Vielen Dank im voraus
Dominic
Die Methode zum Senden von Daten:
Die Methode zum Setzen des Ports:
Die Methode zum Abfragen des AnalogInputs:
ich schreibe derzeit an einem Programm, welches Nachrichten über die Netzwerkschnittstelle an einen NetIO sendet. Der NetIO antwortet bzw. sendet je nach Anfrage einen String mit unterschiedlichem Inhalt zurück.
Ein Thread sendet Permanent Anfragen um Analogwerte abzufragen. Ein anderer Thread sendet "gleichzeitig" den Befehl zum Ein- und Ausschalten eines Digital-Ports. Hierbei kommen sich beide Threads in die Quere, denn sie greifen beide auf diesselbe Methode, zum Senden der Daten, zu! Sie erwarten aber jeweils einen anderen Wert ("setPort()" erwartet ein "ACK" und "getADC()" einen Wert zwischen 0 und 1023). Das geht leider regelmäßig schief.
Wie schaffe ich es, die einzelnen Threads (die bei mir einzelne Klassen sind) zu synchronisieren? Ich habe schon ein wenig über "sychronized" gelesen. Kann ich beispielsweise ein Objekt erzeugen und den beiden Threads im synchronized-Aufruf mitgeben? Regelt Java dann von selbst, wann welcher Thread auf die Methode(n) in der main-Klasse zugreifen darf und wartet ab bis diese ihre Antwort vom NetIO erhalten hat. Oder gibt es eine andere Möglichkeit?
Vielen Dank im voraus
Dominic
Die Methode zum Senden von Daten:
Java:
private String sendData(String msg)
{
String read = "";
try
{
PrintWriter pw = new PrintWriter(socket.getOutputStream());
BufferedReader in = new BufferedReader(new InputStreamReader(socket.getInputStream()));
pw.println(msg+"\r\n");
pw.flush();
read = in.readLine();
read = read.replaceAll("\0", "").replaceAll("\r\n", "").trim();
}
catch (IOException e)
{
e.printStackTrace();
}
}
return read;
}
Die Methode zum Setzen des Ports:
Java:
public boolean setPort(int port, boolean level)
{
if(port < 1 || port > 8)
{
return false;
}
char levelchar = level ? '1' : '0';
return sendData("SETPORT "+port+"."+levelchar).equals("ACK");
}
Die Methode zum Abfragen des AnalogInputs:
Java:
public int getADC(int port)
{
if(port < 1 || port > 4)
{
return -1;
}
return Integer.parseInt(sendData("GETADC "+port));
}