Actualmente estoy intentando aprender a trabajar en red con Python asyncore y pyqt4.QObject (QPlainTextEdit) y problemas de subprocesamiento múltiple
Codifiqué un pequeño servidor, que básicamente escucha en algún puerto, y reenvía todos los mensajes que recibe al remitente.
Dado que ambos cuartos de galón QApplication.exec_()
y asyncore.loop()
son funciones que no volver nunca que no a los dos podría comenzar en un hilo, así que miraron asyncore.loop()
en un hilo de utilidad independiente.
Cada vez que mi clase de servidor (derivado de asyncore.dispatcher
) establece o cae una conexión, o envía/recieves un mensaje, se llama a los métodos de mi clase de ventana (derivado de QtGui.QMainWindow
), que muestra la información en una QPlainTextEdit
.
Pero el texto no está visible, a menos que marque el texto con el mouse.
Python pantallas de la consola siguientes msg del error:
QObject::connect: Cannot queue arguments of type 'QTextBlock'
(Make sure 'QTextBlock' is registered using qRegisterMetaType().)
QObject::connect: Cannot queue arguments of type 'QTextCursor'
(Make sure 'QTextCursor' is registered using qRegisterMetaType().)
He leído en algún foro, que esto puede ser causado por llamar qt-funciones desde otro hilo, y que el uso de señales & ranuras en lugar de llamar la función normal puede soluciona el problema, pero también he intentado con las señales, y sigo teniendo este error.
Entonces, (si esa es realmente la causa de mis problemas) ¿cuál es la forma correcta de llamar a los métodos de un objeto qt desde otro subproceso?
EDITAR Más información: la asyncore.loop() se encuentra en el hilo hijo, así que no es realmente el bloqueo, pero sólo durante el tiempo de ejecución de asyncore.loop() mi clase de servidor (asyncore.dispatcher) puede hacer redes. Entonces, durante el tiempo de ejecución de asyncore.loop() los métodos de mi clase Servidor SON llamados por asyncore.loop() (= hilo hijo), y en estos i intenté emitir señales a la clase de ventana que se ejecuta en el hilo principal
EDIT: Parece que lo tengo funcionando ahora, tuve algunos errores en mi código, todo funciona según lo previsto con las señales ahora.
EDIT: pequeño ejemplo: http://paste2.org/p/635612 (enlace no válido)
¿Puede publicar una explicación o un fragmento de la solución de trabajo? Seguramente ayudaría a otros con el mismo problema en el futuro. =) –