Hallo Zusammen,
ich sitze jetzt schon seit einer Woche an einem Problem/Bug, den ich einfach nicht beheben kann. Ich schildere Mal kurz den Hintergrund:
Momentan arbeite ich in einem Team daran, eine Künstliche Intelligenz für die RoboCup 2D Simulation League zu erstellen. Also eine KI für Fußballspieler. (Das ganze geschieht im Rahmen einer Projektarbeit für die Uni)
Diese Fußballspieler, müssen auf den Rechnern als eigene Prozesse laufen, also pro Prozess ein Fußballspieler (Die Regeln sehen das so vor... )
Programmiertechnisch stehen diese Spieler schon bereit. Werden die Spieler erstellt, verbinden Sie sich mit einem Server, tauschen Informationen mit dem Server aus, parsen einige Informationen usw.
Die Kommunikation mit dem Server und der Parser laufen innerhalb dieser Spieler in Threads ab. Diese werden durchgehend miteinander Synchronisiert.
Momentan sieht es so aus, dass man die Spieler folgendermaßen startet:
Auf diese Weise erstellen wir uns einen Spieler, welcher sich dann mit dem Server verbindet und die ganzen Threads ständig durchläuft. Die einzige spielerische Aktion, die dieser Spieler durchführt, ist sich durchgehend zu drehen. (Natürlich nur zu Testzwecken ) Das funktioniert soweit auch alles tadellos.
Das Problem:
Wie bereits angesprochen, müssen diese Spieler als eigene Prozesse auf dem Rechner laufen.
Das habe ich folgendermaßen mit dem Processbuilder "versucht":
Diese Methode wird in einer anderen Methode innerhalb einer Schleife aufgerufen und bekommt als Parameter Informationen aus TextFields übergeben. Die Klasse die aufgerufen wird, sieht so ähnlich aus wie in meinem ersten Codebeispiel. Der einzige Unterschied ist, dass beim Aufruf Parameter übergeben werden, welche lediglich zum Erstellen eines "HexagonRunners" verwendet werden.
Das funktioniert soweit auch "ganz okay", nur leider nicht ganz wie es soll.
Die Prozesse werden erstellt, die Spieler verbinden sich mit dem Server, führen ein Mal den Befehl zum drehen aus, und ab diesem Moment stehen sie still.
Die Prozesse bleiben geöffnet, arbeiten anscheinend auch (ziehen ordentlich CPU), sind noch immer mit dem Server verbunden, aber es tut sich einfach nichts mehr.
Ich weiß einfach nicht woran es liegt. Ich hab mich schon durch einige andere Foren gelesen und verschiedenes ausprobiert. Zuletzt hängen geblieben bin ich bei der Klasse ExecutorService. Diese sollte eigentlich Abhilfe schaffen. Das Ganze hat aber nicht funktioniert, weil der Fehler entweder wo anders liegt oder ich zu doof bin den Executor richtig zu verwenden.
Soviel zu meiner Problemstellung, wollte meine Angelegenheit etwas genauer formulieren.
Ich hoffe, mir kann bei meinem Problem geholfen werden.
Bin für alle Vorschläge offen.
Grüße, kick
ich sitze jetzt schon seit einer Woche an einem Problem/Bug, den ich einfach nicht beheben kann. Ich schildere Mal kurz den Hintergrund:
Momentan arbeite ich in einem Team daran, eine Künstliche Intelligenz für die RoboCup 2D Simulation League zu erstellen. Also eine KI für Fußballspieler. (Das ganze geschieht im Rahmen einer Projektarbeit für die Uni)
Diese Fußballspieler, müssen auf den Rechnern als eigene Prozesse laufen, also pro Prozess ein Fußballspieler (Die Regeln sehen das so vor... )
Programmiertechnisch stehen diese Spieler schon bereit. Werden die Spieler erstellt, verbinden Sie sich mit einem Server, tauschen Informationen mit dem Server aus, parsen einige Informationen usw.
Die Kommunikation mit dem Server und der Parser laufen innerhalb dieser Spieler in Threads ab. Diese werden durchgehend miteinander Synchronisiert.
Momentan sieht es so aus, dass man die Spieler folgendermaßen startet:
Java:
public class GeneralAgentTest {
public static void main(String [] args){
Thread thread = new Thread(new HexagonRunner("127.0.0.1",6000,"UnitedTestors",-30,-15));
// IP, Port, Teamname, Startpositionen X und Y
thread.start();
}
}
Auf diese Weise erstellen wir uns einen Spieler, welcher sich dann mit dem Server verbindet und die ganzen Threads ständig durchläuft. Die einzige spielerische Aktion, die dieser Spieler durchführt, ist sich durchgehend zu drehen. (Natürlich nur zu Testzwecken ) Das funktioniert soweit auch alles tadellos.
Das Problem:
Wie bereits angesprochen, müssen diese Spieler als eigene Prozesse auf dem Rechner laufen.
Das habe ich folgendermaßen mit dem Processbuilder "versucht":
Java:
public void execute(Class klasse, int a, String str, String team, String x,
String y) {
String javaHome = System.getProperty("java.home");
String javaBin = javaHome + File.separator + "bin" + File.separator
+ "java";
String classpath = System.getProperty("java.class.path");
String className = klasse.getCanonicalName();
ProcessBuilder builder = new ProcessBuilder(javaBin, "-cp", classpath,
className, ip, port, team, str, x, y);
try {
process[a] = builder.start();
System.out.println("Should started");
} catch (Exception e) {
e.printStackTrace();
System.out.println("failed");
}
}
Diese Methode wird in einer anderen Methode innerhalb einer Schleife aufgerufen und bekommt als Parameter Informationen aus TextFields übergeben. Die Klasse die aufgerufen wird, sieht so ähnlich aus wie in meinem ersten Codebeispiel. Der einzige Unterschied ist, dass beim Aufruf Parameter übergeben werden, welche lediglich zum Erstellen eines "HexagonRunners" verwendet werden.
Das funktioniert soweit auch "ganz okay", nur leider nicht ganz wie es soll.
Die Prozesse werden erstellt, die Spieler verbinden sich mit dem Server, führen ein Mal den Befehl zum drehen aus, und ab diesem Moment stehen sie still.
Die Prozesse bleiben geöffnet, arbeiten anscheinend auch (ziehen ordentlich CPU), sind noch immer mit dem Server verbunden, aber es tut sich einfach nichts mehr.
Ich weiß einfach nicht woran es liegt. Ich hab mich schon durch einige andere Foren gelesen und verschiedenes ausprobiert. Zuletzt hängen geblieben bin ich bei der Klasse ExecutorService. Diese sollte eigentlich Abhilfe schaffen. Das Ganze hat aber nicht funktioniert, weil der Fehler entweder wo anders liegt oder ich zu doof bin den Executor richtig zu verwenden.
Soviel zu meiner Problemstellung, wollte meine Angelegenheit etwas genauer formulieren.
Ich hoffe, mir kann bei meinem Problem geholfen werden.
Bin für alle Vorschläge offen.
Grüße, kick