IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PyQt Python Discussion :

[PyQt] Mon appli se fige avec les sockets


Sujet :

PyQt Python

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 43
    Points : 42
    Points
    42
    Par défaut [PyQt] Mon appli se fige avec les sockets
    Bonjour,

    Je débute en python et j'essaye de faire une application client/serveur avec une interface graphique en pyQT.
    Pour l'instant j'essaye de creer l'interface du "serveur".

    Pour l'instant c'est très simple j'ai juste une fenêtre avec un beau boutton qui lorsqu'il est cliqué se met en attente de connexions.

    Hors quand je clique sur ce boutton, l'appli se fige completement.
    Les sockets fonctionnent bien (je peux me connecter via telnet).

    Voici mon code:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    #!/usr/bin/python
    # -*- coding: utf8 -*-
    import sys
    import string
    import pickle
    import os
    import SocketServer
    import thread
    from qt import *
    from main import *
     
    class GestionnaireEcho(SocketServer.BaseRequestHandler):
    	def handle(self):
    		while True:
    			donneesRecues = self.request.recv(8192)
    			if not donneesRecues: break
    			self.request.sendall(donneesRecues)
    		self.request.close()
     
    class sync:
    	index=-1
    	def __init__(self,args):
    		self.qtapp=QApplication(args)
    		self.win=Main()
    		self.win.show()
     
    		self.qtapp.connect(self.win.Sync,SIGNAL("clicked()"),self.sync)
    		self.qtapp.connect(self.win.annuler,SIGNAL("clicked()"),self.annuler)
    		self.qtapp.connect(self.qtapp, SIGNAL("lastWindowClosed()"),self.qtapp,SLOT("quit()"))
    		self.qtapp.exec_loop()
     
    	def sync(self):
    		self.win.Text1.setText("ok")
    		self.win.Sync.setEnabled(False)
    		serveur = SocketServer.ThreadingTCPServer(('', 8881), GestionnaireEcho)
    		serveur.serve_forever()
     
    	def annuler(self):
    		self.win.Sync.setEnabled(True)
     
    def main(args):
    	msync = sync(args)
     
    if __name__=="__main__":
    	main(sys.argv)
    Merci par avance de votre aide

  2. #2
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Normal, l'appel à serveur.serve_forever() est bloquant.

    Ce que je fais, moi, c'est que je gère toutes les connexions de matière asynchrone dans un thread à part.
    Boost ftw

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Janvier 2006
    Messages
    43
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2006
    Messages : 43
    Points : 42
    Points
    42
    Par défaut
    En fait j'ai réussit à débloquer en partie la situation en executant les sockets dans un thread.

    Mais maintenant le pb c'est que lorsque je ferme l'appli, le thread avec les sockets reste en execution

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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
     
    #!/usr/bin/python
    # -*- coding: utf8 -*-
    import sys
    import string
    import pickle
    import os
    import SocketServer
    from threading import Thread
    import time
    from qt import *
    from main import *
     
     
    class GestionnaireEcho(SocketServer.BaseRequestHandler):
    	def handle(self):
    		while True:
    			donneesRecues = self.request.recv(8192)
    			if not donneesRecues: break
    			self.request.sendall(donneesRecues)
    		self.request.close()
     
    class sync:
    	index=-1
    	def __init__(self,args):
    		self.qtapp=QApplication(args)
    		self.win=Main()
    		self.win.show()
     
    		self.qtapp.connect(self.win.Sync,SIGNAL("clicked()"),self.sync)
    		self.qtapp.connect(self.win.annuler,SIGNAL("clicked()"),self.annuler)
    		self.qtapp.connect(self.qtapp, SIGNAL("lastWindowClosed()"),self.qtapp,SLOT("quit()"))
    		self.qtapp.exec_loop()
     
    	def sync(self):
    		self.win.Text1.setText("ok")
    		self.win.Sync.setEnabled(False)
    		def connexion(args):
    			serveur = SocketServer.ThreadingTCPServer(('', 8881), GestionnaireEcho)
    			serveur.serve_forever()
    			time.sleep(args)
    		t1 = Thread(target = connexion, args = (.3, ))
    		t1.start()
     
    	def annuler(self):
    		self.win.Sync.setEnabled(True)
     
    def main(args):
    	msync = sync(args)
     
    if __name__=="__main__":
    	main(sys.argv)
    Ca va finir par me déprimer cette histoire

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Fais en sorte que quand on ferme la fenêtre le code suivant soit executé
    Boost ftw

Discussions similaires

  1. Récupérer Adresse IP Réseau avec les sockets
    Par SteelBox dans le forum Réseau
    Réponses: 21
    Dernier message: 14/05/2007, 10h28
  2. Réponses: 8
    Dernier message: 22/11/2005, 07h29
  3. Le chat (avec les sockets) sans frames.
    Par azmeuk dans le forum Langage
    Réponses: 1
    Dernier message: 18/10/2005, 19h47
  4. Problème d'envoie de text avec les sockets
    Par Coussati dans le forum Web & réseau
    Réponses: 6
    Dernier message: 16/09/2005, 10h26
  5. [Win32] Problème avec les sockets
    Par mickael777 dans le forum MFC
    Réponses: 3
    Dernier message: 12/08/2005, 11h15

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo