2 Stimmen

Problem mit Fäden

*Ich verwende Java.

Ich habe diesen Thread, Agent, der einen Raum erforscht, um seine Größe zu bestimmen und ihn zu reinigen, wenn er schmutzig ist. Dann habe ich die Schnittstelle, die den Agenten zeichnet, während er die Umgebung erkundet. Agent ist eine Unterklasse von Thread, und Java kümmert sich um die Verwaltung der Threads. Alles, was ich tun muss, ist, den Thread zu erstellen und object.start() zu sagen.

Dies funktioniert unter normalen Umständen sehr gut. Allerdings sind die Menüs während dieser Zeit aktiviert, und das bedeutet, dass der Benutzer mit dem Raum herumspielen kann, während der Agent ihn erkundet. Das sollte nicht passieren.

Sobald der Benutzer also auf die Option klickt, die den Agenten auffordert, den Raum zu reinigen, möchte ich alle Menüs deaktivieren. Nur funktioniert das nicht so, wie es sollte. Hier ist das Problem:

...
public void ActionPerformed(ActionEvent e)
{
    //disable the menus with setEnabled(false);
    agent.start();
    //enable the menus with setEnabled(true);
}

Das Problem ist, dass die Menüs aktiviert werden, bevor der Agententhread seine Funktion ausführt. Ich dachte an die Verwendung von Thread.join() - das würde garantieren, dass der Code zum Aktivieren der Menüs erst nach dem Ende des Agenten-Threads ausgeführt wird. Aber wenn ich Thread.join() verwende, aktualisiert sich die Oberfläche nicht, während sich der Agent bewegt, weil sie darauf wartet, dass der Agent beendet wird!

Ich habe darüber nachgedacht, die Schnittstelle vom Agenten aus zu deaktivieren und sie dann zu aktivieren, sobald der Agent fertig ist, aber ich bin mir nicht sicher, ob das funktionieren würde, und das größte Problem hier ist, dass der Agent nicht mit den Menüs herumspielen sollte.

Also, um es zusammenzufassen, ich brauche einen Thread, der ausgeführt wird, um die Schnittstelle zu aktualisieren/den Agenten zu zeichnen, der sich bewegt, aber dieser Thread kann nicht derselbe sein, der das Menü aktiviert. Derzeit scheint es einen Thread zu geben, der beides tut. Angenommen, das ist möglich und nicht zu kompliziert.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X