Ver Mensaje Individual
  #1 (permalink)  
Antiguo 25/08/2012, 20:20
samuelb1311
 
Fecha de Ingreso: diciembre-2011
Mensajes: 26
Antigüedad: 12 años, 11 meses
Puntos: 5
Exclamación Problema con Threads y QT

Hola a todos, estoy tratando de crear un chat en Python usando como Interfaz grafica QT, tengo el siguientes codigo:

server.py
Código Python:
Ver original
  1. import asyncore, socket
  2.  
  3. clients = {}
  4.  
  5. class MainSocketServer(asyncore.dispatcher):
  6.     def __init__(self, puerto):
  7.         asyncore.dispatcher.__init__(self)
  8.         self.create_socket(socket.AF_INET, socket.SOCK_STREAM)
  9.         self.bind(('', puerto))
  10.         self.listen(10)
  11.  
  12.     def handle_accept(self):
  13.         newSocket, address = self.accept()
  14.         clients[address] = newSocket
  15.         print "Conectado desde", address
  16.         SecondSocketServer(newSocket)
  17.  
  18. class SecondSocketServer(asyncore.dispatcher_with_send):
  19.     def handle_read(self):
  20.         mensaje = self.recv(1000)
  21.         if mensaje:
  22.             clientes = clients.values()
  23.             for cliente in clientes:
  24.                 cliente.send(mensaje+'\n')
  25.         else:
  26.             self.close()
  27.  
  28.     def handle_close(self):
  29.         print "Desconectado desde", self.getpeername()
  30.         del clients[self.getpeername()]
  31.  
  32. MainSocketServer(9090)
  33. asyncore.loop()



client.py
Código Python:
Ver original
  1. from PySide import QtGui, QtCore
  2. import socket, thread, sys
  3.  
  4. socket_cliente = socket.socket()
  5. socket_cliente.connect(('', 9090))
  6.  
  7. class Window(QtGui.QMainWindow):
  8.     def __init__(self):
  9.         super(Window, self).__init__()
  10.         self.socket()
  11.  
  12.         self.browser = QtGui.QTextBrowser()
  13.         self.browser.backwardAvailable
  14.  
  15.         self.textEdit = QtGui.QTextEdit()
  16.         self.textEdit.setMaximumSize(QtCore.QSize(400, 60))
  17.  
  18.         self.connect(self.browser, QtCore.SIGNAL("returnPressed()"), self.enviar_mensaje)
  19.  
  20.         enviarB = QtGui.QPushButton("Enviar")
  21.         enviarB.setMaximumSize(QtCore.QSize(400, 60))
  22.         enviarB.clicked.connect(self.enviar_mensaje)
  23.  
  24.         layoutINlayout = QtGui.QHBoxLayout()
  25.         layoutINlayout.addWidget(self.textEdit)
  26.         layoutINlayout.addWidget(enviarB)
  27.  
  28.         widget = QtGui.QWidget()
  29.         self.setCentralWidget(widget)
  30.  
  31.         self.layout = QtGui.QVBoxLayout()
  32.         self.layout.addWidget(self.browser)
  33.  
  34.         mainWindow = QtGui.QVBoxLayout()
  35.         mainWindow.addLayout(self.layout)
  36.         mainWindow.addLayout(layoutINlayout)
  37.  
  38.         widget.setLayout(mainWindow)
  39.         self.setWindowFlags(QtCore.Qt.WindowTitleHint)
  40.  
  41.     def enviar_mensaje(self):
  42.         mensaje = self.textEdit.toPlainText()
  43.         socket_cliente.send(mensaje)
  44.  
  45.     def add_mensaje(self, mensaje):
  46.         self.browser.setText(mensaje)
  47.  
  48.     def socket(self):
  49.         def loop():
  50.             while True:
  51.                 mensaje = socket_cliente.recv(1000)
  52.                 if mensaje:
  53.                     self.add_mensaje(mensaje)
  54.  
  55.         thread.start_new_thread(loop, ())
  56.  
  57. app = QtGui.QApplication(sys.argv)
  58. w = Window()
  59. w.show()
  60. app.exec_()

El servidor en realidad no da ningun problema, pero el cliente me da el siguiente error:

Código:
QObject: Cannot create children for a parent that is in a different thread.
(Parent is QTextDocument(0x95e29f0), parent's thread is QThread(0x9140ea0), current thread is QThread(0xafe009a0)
Violación de segmento (`core' generado)
Estuve revisando y este error da en la linea 53 de client.py al tratar de acceder a la funcion add_mensaje de la clase Window, no se si esque el thread no tiene permiso para acceder a las funciones de la clase o algo asi porque si cambio la linea 53 por "print mensaje", me imprime bien el mensaje que llega.

Espero me puedan ayudar con esto

Última edición por samuelb1311; 25/08/2012 a las 20:54