Gui blockiert

Hackepeter

Aktives Mitglied
Servus,

wir haben eine Klasse für unseren Server angelegt und im Konstruktor des Servers haben wir folgende Codezeilen:

Java:
while (true)
        {
            Socket clientSocket=server.accept();
            new InputThread(clientSocket, this.serverView).start();
        }

Hier warten wir halt auf eine Connection von außen. Die Sache ist die, wenn wir den Server über die main aufrufen, wird die GUI gerendert und der Server läuft normal. Wenn wir aber nun den Server im Hauptmenü der eigentlichen Anwendung aufrufen wollen, landen wir in einer Endlosschleife und die GUI vom Server wird nicht gerendert.

Weiß jemand, woran das liegen kann?

Gruß
 
Zuletzt bearbeitet von einem Moderator:
B

bone2

Gast
was steht in der main? wenn ihr das als unterprogramm der eigentlichen anwendung aufruft, geht ihr dann über die main in den server rein?
 

Hackepeter

Aktives Mitglied
Nein, also in der main sieht es ungefähr so aus, wenn wir nur den Server starten:

Java:
import view.server.VServer;

public class main
{

    public static void main(String[] args)
    {
        VServer server = new VServer();
    }

}

Und wenn wir es in der Anwendung selbst machen, wird in der main erstmal ein Anmeldefenster geöffnet:

Java:
import view.menue.VAnmelden;

public class main
{

    public static void main(String[] args)
    {
        VAnmelden anmelden = new VAnmelden();
    }

}

Naja, im Anmelden-Fenster wird, wenn manden Button "Server starten" anwählt, ein ActionListener im Controller aufgerufen. Im Controller wird wird dann eine andere Methode im Controller aufgerufen mit folgendem Inhalt:

Java:
private void serverStarten()
{
    server = new VServer();
    this.anmeldemaske.dispose();
}

server ist bereits als Klassenattribut deklariert (private VServer server;).
 
S

SlaterB

Gast
Listener von Buttons müssen unmittelbar fertig sein, sonst blockiert die GUI, wie du siehst,
langfristige Aktionen gehören in einen separaten Thread, evtl. vom Listener gestartet

die main-Methode ist ein separater Thread, der läuft entweder aus oder du nutzt ihn z.B. für diesen Zweck
 
S

SlaterB

Gast
@Templarthelast
Vorsicht mit der Formulierung, ein Actionlistener kann nur vom AWT-Event-Thread ausgeführt werden, jedenfalls auf normalen Weg nach Button-Klick,
wenn dort ein separater Thread gestartet wird dann ist das nicht mehr 'während dem Ausführend des Actionlisteners', der ist längst beendet und abgearbeitet
 

Hackepeter

Aktives Mitglied
Danke schonmal, habe jetzt einen Thread im Controller erstellt:

Java:
public class ServerThread extends Thread
    {
        private VServer server;
        public void run()
        {
            while(server != null)
            {
                System.out.println("Test");
            }
            System.out.println("Der Server wurde beendet");
        }
        
        public ServerThread()
        {
            this.server = new VServer();
        }
    }

Allerdings wird die GUI immernoch nicht gerendert und es tut sich nichts.

Aufgerufen wird das ganze immernoch in der Methode anmelden() welche vom ActionListerner aufgerufen wird:

Java:
private void serverStarten()
    {
        this.svThread = new ServerThread();
    	this.anmeldemaske.dispose();
    }
 
S

SlaterB

Gast
tja, blind Befehle auszuprobieren führt nicht immer zum Ziel,
wenn du nicht weißt was ein Thread ist darfst du gerne erstmal 2 Tage dazu lernen..

aber das ist wohl kaum die angestrebte Lösung ;)
kurzfristige Korrektur:
- Konstruktor im Thread weg,
- den 'new VServer()'-Aufruf in die run-Methode, deren bisherigen Inhalt entfernen,
auf Beenden wird dort eh nicht gewartet, wenn dieser Thread die accept-Schleife ausführen soll
- in serverStarten() noch mit svThread.start() den Thread auch starten
 
Zuletzt bearbeitet von einem Moderator:

Hackepeter

Aktives Mitglied
Oh Gott wie peinlich. Das Starten habe ich in der Tat vergessen. Das mit dem Konstruktor war einfach nur dämlich von mir. Funktioniert nun wunderbar. Vielen Dank dir!
 

Ähnliche Java Themen

Neue Themen


Oben