Manejar varios QThread a la vez, proteger zonas críticas con QMutex y por qué las señales son la forma segura de actualizar la GUI desde múltiples hilos.
En el ejemplo, el primer for está protegido por el QMutex: aunque haya 5 threads, solo uno ejecuta esa parte a la vez. El segundo for no tiene mutex, así que todos avanzan en paralelo. El QMutex se crea una vez en la ventana y se comparte entre todos los threads.
Un mismo objeto QMutex debe ser compartido por todos los threads que quieras coordinar. Si cada thread crea el suyo propio, no habrá exclusión mutua entre ellos.
# BIEN: el thread emite una señal y la ventana hace el cambioclass Cuadrado(QThread): @posicion.setter def posicion(self, nueva): self._posicion = nueva x, y = nueva self.senal_mover.emit(self.id, x, y) # delega el cambio a PyQt # En la ventana:self.senal_mover.connect(self.mover) def mover(self, id, x, y): self.labels[id].move(x, y)Al usar señales, el cambio de la interfaz se delega al manejo de eventos de PyQt, que lo procesa de forma ordenada. Así se evaden los problemas de concurrencia: con 100 threads la versión con señales sigue funcionando, mientras que la versión con cambio directo se cae.
Conclusión: en general, las señales son la forma más segura y escalable de actualizar la interfaz desde varios threads, porque el cambio lo realiza el bucle de eventos de PyQt y no cada thread por su cuenta.