fixed a bug where creating a room and quiting it would not close the thread

This commit is contained in:
Faraphel 2023-02-19 17:07:21 +01:00
parent 5dcd570be8
commit f38f440e9d
4 changed files with 29 additions and 12 deletions

View file

@ -6,5 +6,4 @@ A faire :
- Combiner le _event_wrapper de Window et Scene (?) - Combiner le _event_wrapper de Window et Scene (?)
Bug : Bug :
- Appuyez sur "Créer une salle" va lancer un thread, mais il n'est pas fermé s'il l'on revient dans - /
le menu principal

View file

@ -6,7 +6,6 @@ import requests
from source import network from source import network
from source.gui.scene.abc import Scene from source.gui.scene.abc import Scene
from source.gui import widget, texture from source.gui import widget, texture
from source.utils.dict import dict_add_prefix
if TYPE_CHECKING: if TYPE_CHECKING:
from source.gui.window import Window from source.gui.window import Window
@ -36,8 +35,7 @@ class RoomCreate(Scene):
label_batch=self.batch_label label_batch=self.batch_label
) )
from source.gui.scene import MainMenu self.back.add_listener("on_click_release", self.button_back_callback)
self.back.add_listener("on_click_release", lambda *_: self.window.set_scene(MainMenu))
self.label_ip = self.add_widget( self.label_ip = self.add_widget(
widget.Text, widget.Text,
@ -65,6 +63,11 @@ class RoomCreate(Scene):
self.thread = network.Host(window=self.window, daemon=True, username="Host") self.thread = network.Host(window=self.window, daemon=True, username="Host")
self.thread.start() self.thread.start()
def button_back_callback(self, *_):
self.thread.stop()
from source.gui.scene import MainMenu
self.window.set_scene(MainMenu)
def on_draw(self): def on_draw(self):
self.batch_button_background.draw() self.batch_button_background.draw()
self.batch_label.draw() self.batch_label.draw()

View file

@ -30,8 +30,7 @@ class RoomJoin(Scene):
label_batch=self.batch_label label_batch=self.batch_label
) )
from source.gui.scene import MainMenu self.back.add_listener("on_click_release", self.button_back_callback)
self.back.add_listener("on_click_release", lambda *_: self.window.set_scene(MainMenu))
self.entry_ip = self.add_widget( self.entry_ip = self.add_widget(
widget.Input, widget.Input,
@ -76,6 +75,10 @@ class RoomJoin(Scene):
username="Client" username="Client"
).start()) ).start())
def button_back_callback(self, *_):
from source.gui.scene import MainMenu
self.window.set_scene(MainMenu)
def on_draw(self): def on_draw(self):
self.batch_button_background.draw() self.batch_button_background.draw()
self.batch_input_background.draw() self.batch_input_background.draw()

View file

@ -15,20 +15,32 @@ class Host(Thread):
def __init__(self, window: "Window", username: str, port: int = 52321, **kw): def __init__(self, window: "Window", username: str, port: int = 52321, **kw):
super().__init__(**kw) super().__init__(**kw)
self._stop = False
self.window = window self.window = window
self.username = username self.username = username
self.port = port self.port = port
def stop(self) -> None:
self._stop = True
def run(self) -> None: def run(self) -> None:
print("[Serveur] Thread démarré") print("[Serveur] Thread démarré")
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s: with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind(("", self.port)) s.bind(("", self.port)) # connecte le socket au port indiqué
s.listen()
connection, address = s.accept() s.settimeout(5) # defini le timeout à 5 secondes
s.listen() # écoute de nouvelle connexion
while True:
try:
connection, address = s.accept() # accepte la première connexion entrante
break # sort de la boucle
except socket.timeout: # en cas de timeout
if self._stop: return # vérifie si le thread n'est pas censé s'arrêter
# sinon, réessaye
print(f"[Serveur] Connecté avec {address}") print(f"[Serveur] Connecté avec {address}")
pyglet.clock.schedule_once(lambda dt: self.window.set_scene(scene.Game), 0) pyglet.clock.schedule_once(lambda dt: self.window.set_scene(scene.Game), 0)