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

View file

@ -30,8 +30,7 @@ class RoomJoin(Scene):
label_batch=self.batch_label
)
from source.gui.scene import MainMenu
self.back.add_listener("on_click_release", lambda *_: self.window.set_scene(MainMenu))
self.back.add_listener("on_click_release", self.button_back_callback)
self.entry_ip = self.add_widget(
widget.Input,
@ -76,6 +75,10 @@ class RoomJoin(Scene):
username="Client"
).start())
def button_back_callback(self, *_):
from source.gui.scene import MainMenu
self.window.set_scene(MainMenu)
def on_draw(self):
self.batch_button_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):
super().__init__(**kw)
self._stop = False
self.window = window
self.username = username
self.port = port
def stop(self) -> None:
self._stop = True
def run(self) -> None:
print("[Serveur] Thread démarré")
with socket.socket(socket.AF_INET, socket.SOCK_STREAM) as s:
s.bind(("", self.port))
s.listen()
connection, address = s.accept()
s.bind(("", self.port)) # connecte le socket au port indiqué
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}")
pyglet.clock.schedule_once(lambda dt: self.window.set_scene(scene.Game), 0)