J'essaie actuellement de réseauter avec Python asyncore et pyqt4.QObject (QPlainTextEdit) et problèmes de multithread
J'ai codé un petit serveur, qui écoute essentiellement sur certains ports, et renvoie tous les messages qu'il reçoit à l'expéditeur.
Depuis deux pintes QApplication.exec_()
et asyncore.loop()
sont des fonctions qui ne reviennent jamais je ne pouvais pas les lancer à la fois dans un thread, donc je regardé fixement asyncore.loop()
dans un thread démon séparé.
Chaque fois que ma classe de serveur (dérivé de asyncore.dispatcher
) établit ou supprime une connexion, ou envoie/reçoit un message, il appelle des méthodes de ma classe de fenêtre (dérivée de QtGui.QMainWindow
), qui affiche les informations dans un QPlainTextEdit
.
Mais le texte n'est pas visible, sauf si vous marquez le texte avec la souris.
console Python affiche suivantes msg d'erreur:
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().)
je lis sur certains forum, que cela peut être dû en appelant qt-fonctions d'un autre fil, et en utilisant des signaux & emplacements au lieu d'appeler la fonction simple peut résoudre le problème, mais j'ai essayé des signaux aussi, et j'ai toujours cette erreur.
Donc, (si c'est vraiment la cause de mes problèmes) quelle est la bonne façon d'appeler les méthodes d'un objet qt d'un autre thread?
EDIT Plus d'info: le asyncore.loop() est situé dans le fil de l'enfant, bien son blocage pas vraiment, mais seulement pendant l'exécution de asyncore.loop() ma classe Server (asyncore.dispatcher) peut faire du réseautage. Donc, pendant l'exécution de asyncore.loop() les méthodes de ma classe Server sont appelées par asyncore.loop() (= thread fils), et dans ces essayé d'émettre des signaux à la classe de fenêtre en cours d'exécution dans le thread principal
EDIT: on dirait que je l'ai eu à travailler maintenant, j'ai eu quelques erreurs dans mon code, tout fonctionne comme prévu avec des signaux maintenant.
EDIT: petit exemple: http://paste2.org/p/635612 (lien mort)
Pouvez-vous publier une explication ou un extrait de la solution de travail? Cela aiderait sûrement les autres avec le même problème à l'avenir. =) –