Problème sortie de Thread
Bonjour à tous,
J'essaie de faire un petit programme de chat via python.
J'ai réussi à résoudre certains problèmes mais sur celui-ci, je sèche.
J'ai essayé pleins de choses, mais en définitive, je m'aperçois que je pars surtout dans tous les sens sans aboutir à un résultat.
Le problème est le suivant. Lorsque mon serveur envoie l'instruction "Quit" au client, celui-ci devrait quitter. Hors, pour une raison que je n'arrive pas à déterminer, je n'arrive pas à stopper mes threads. Dans la version ci-dessous. C'est la fonction "Send" qui pose problème.
J'ai l'erreur suivante:
Code:
1 2 3 4 5 6 7 8 9
| Sortie de boucle envoi
Traceback (most recent call last):
File "C:\Users\Austin\OneDrive\Python\Projets\netcommand\client.py", line 96, in <module>
SENDER.join()
File "C:\Program Files\Python35\lib\threading.py", line 1054, in join
self._wait_for_tstate_lock()
File "C:\Program Files\Python35\lib\threading.py", line 1070, in _wait_for_tstate_lock
elif lock.acquire(block, timeout):
KeyboardInterrupt |
Pouvez-vous m'indiquer quelques pistes car je tourne en rond et fini par faire n'importe quoi?
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107
| """Module client pour lancement de commande à distance"""
#!/usr/bin/env python3
# -*- coding : utf-8 -*-
import socket
import sys
import threading
import _thread
class SendCommand(threading.Thread):
"""Envoyer un message/commande"""
def __init__(self, connexion):
threading.Thread.__init__(self)
self.connexion = connexion
self.exits = False
nom = self.getName()
print("thread d'envoi : "+nom)
def input_timeout(self, prompt, timeout=0.001):
"""Stop le prompt régulièrement et vérifie si le flag d'arrêt du thread toujours vrai"""
#print(prompt,)
timer = threading.Timer(timeout, _thread.interrupt_main)
message = None
if not self.exits:
try:
timer.start()
message = input(prompt)
except KeyboardInterrupt:
pass
timer.cancel()
return message
def run(self):
"""Fonction d'émission de message"""
while not self.exits:
command = self.input_timeout("---")
if command != "":
self.connexion.send(command.encode("UTF-8"))
else:
pass
self.connexion.send("Déconnexion".encode("UTF-8"))
print("Sortie de boucle envoi")
RECEIVER.quit()
def quit(self):
"""Active le flag pour quitter le thread"""
self.exits = True
class ReceiverMessage(threading.Thread):
"""Recevoir un message d'un client"""
def __init__(self, connexion):
threading.Thread.__init__(self)
self.connexion = connexion
self.exit = False
nom = self.getName()
print("thread de réception : "+nom)
def run(self):
"""Fonction de reception de message"""
while 1:
message = self.connexion.recv(1024).decode("UTF-8")
if message.upper() == "QUIT":
break
elif message != "":
print("*"+message+"*")
print("Sortie de boucle réception")
SENDER.quit()
print("fin sender")
def quit(self):
"""Active le flag pour quitter le thread"""
self.exit = True
if __name__ == '__main__':
HOST = '192.168.1.90'
PORT = 7998
CONNEXION = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
try:
CONNEXION.connect((HOST, PORT))
except socket.error:
print('Connexion impossible')
sys.exit()
print('Connexion établie')
SENDER = SendCommand(CONNEXION)
RECEIVER = ReceiverMessage(CONNEXION)
SENDER.start()
RECEIVER.start()
print("A")
SENDER.join()
RECEIVER.join()
print("B")
#SENDER.quit()
# print("C")
# print("D")
CONNEXION.close()
print('Fin de la connexion avec le serveur') |
Merci d'avance.
Excellente fin d'année à vous et joyeuses fêtes.