Fixed issues with threads where window wouldnt close as Tetris interfiered with tkinter widgets, threads are centralized now

This commit is contained in:
Dennis Eckerskorn 2024-12-07 20:07:04 +01:00
parent 490de3b54d
commit 46f445810a
9 changed files with 37 additions and 7 deletions

View File

@ -10,13 +10,13 @@ class TetrisGame(tk.Canvas):
self.grid = [[0] * self.cols for _ in range(self.rows)] self.grid = [[0] * self.cols for _ in range(self.rows)]
self.current_piece = None self.current_piece = None
self.running = True self.running = False
self.init_game() self.init_game()
def init_game(self): def init_game(self):
self.bind_all("<Key>", self.handle_keypress) self.bind_all("<Key>", self.handle_keypress)
self.spawn_piece() self.spawn_piece()
self.update_game() #self.update_game()
def spawn_piece(self): def spawn_piece(self):
shapes = [ shapes = [
@ -106,7 +106,7 @@ class TetrisGame(tk.Canvas):
self.rotate_piece() self.rotate_piece()
def update_game(self): def update_game(self):
if self.running: if self.running and self.winfo_exists():
if not self.can_move(1, 0): if not self.can_move(1, 0):
self.place_piece() self.place_piece()
else: else:

View File

@ -19,4 +19,5 @@ class ThreadenTask:
"""Detiene el hilo""" """Detiene el hilo"""
self.running = False self.running = False
if self.thread: if self.thread:
self.thread.join() self.thread.join(timeout=1)
self.thread = None

View File

@ -5,6 +5,7 @@ import random
from services.threaden_task import ThreadenTask from services.threaden_task import ThreadenTask
from services.system_monitor import SystemMonitor from services.system_monitor import SystemMonitor
from services.tetris_game import TetrisGame
class ThreadsManager: class ThreadsManager:
"""Constructor""" """Constructor"""
@ -15,6 +16,7 @@ class ThreadsManager:
"time": ThreadenTask(), "time": ThreadenTask(),
"temperature": ThreadenTask(), "temperature": ThreadenTask(),
"emails":ThreadenTask(), "emails":ThreadenTask(),
"tetris_game":ThreadenTask(),
} }
self.system_monitor_tasks = {} self.system_monitor_tasks = {}
@ -41,20 +43,40 @@ class ThreadsManager:
metric metric
) )
if hasattr(self.ui_instance, "tetris_game"):
self.tasks["tetris_game"].start(self.update_tetris_game)
def stop_threads(self): def stop_threads(self):
"""Recorre tasks y para los hilos""" """Recorre tasks y para los hilos"""
for task in self.tasks.values(): for name, task in self.tasks.items():
task.stop() task.stop()
print(f"Hilo '{name}' detenido")
for task in self.system_monitor_tasks.values(): for name, task in self.system_monitor_tasks.items():
task.stop() task.stop()
print(f"Hilo de monitor del sistema '{name}' detenido.")
if self.system_monitor: if self.system_monitor:
self.system_monitor.running = False self.system_monitor.running = False
def update_tetris_game(self):
"""Ciclo de actualizacion del tetris game"""
while self.tasks["tetris_game"].running:
try:
if self.ui_instance.tetris_game.running and self.ui_instance.tetris_game.winfo_exists():
self.ui_instance.tetris_game.update_game()
time.sleep(0.5)
except Exception as e:
print(f"Error en update_tetris_game: {e}")
break
def update_system_metric(self, metric): def update_system_metric(self, metric):
"""Actualiza una métrica específica del monitor del sistema.""" """Actualiza una métrica específica del monitor del sistema."""

View File

@ -56,6 +56,13 @@ class CenteredWindow(ctk.CTk):
def on_close(self): def on_close(self):
"""Maneja el cierre de la ventana""" """Maneja el cierre de la ventana"""
self.thread_manager.stop_threads() self.thread_manager.stop_threads()
if hasattr(self, "tetris_game") and self.tetris_game.running:
self.tetris_game.stop_game()
if "tetris_game" in self.thread_manager.tasks:
self.thread_manager.tasks["tetris_game"].stop()
self.destroy() self.destroy()
@ -141,7 +148,7 @@ class CenteredWindow(ctk.CTk):
"""Método para iniciar el juego.""" """Método para iniciar el juego."""
if not self.tetris_game.running: if not self.tetris_game.running:
self.tetris_game.running = True self.tetris_game.running = True
self.tetris_game.update_game() #self.tetris_game.update_game()