2017-01-16 1 views
0

J'essaie de créer un serveur de jeu multi-thread utilisé QT, donc chaque client est un thread autonome basé sur QThread. Maintenant, je dois envoyer des données à d'autres clients (dans un autre fil) qui dans la même salle de jeu. par exemple, quand un propriétaire de maison a fermé la salle de jeu, le serveur de jeu doit envoyer au message « room_closed » à d'autres clients whichs dans le même Soom, mais il y a une erreur:QSocketNotifier: Les notificateurs de socket ne peuvent pas être activés ou désactivés à partir d'un autre thread

QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread

ps: Je tryed pour utiliser les sinals/slots mais il y a toujours une erreur:

QObject: Cannot create children for a parent that is in a different thread. (Parent is QNativeSocketEngine(0x161764e8), parent's thread is ClientThread(0x16196f10), current thread is QThread(0x14a17278)

que dois-je faire?

Répondre

1

Il semble que vous ne gériez pas QObjects et QThreads correctement et Qt s'en plaint.

Je vous suggère de jeter un oeil à la documentation Qt:

Un guide rapide:

  • Chaque instance de QObject est associée à un QThread (QObject::thread()).
  • Vous pouvez modifier son thread associé en utilisant QObject::moveTothread(), mais le QObject ne doit pas avoir de parent et l'appel doit être effectué à partir du thread auquel QObject est actuellement associé.
  • Certains QObject (sous-classes OS) ont des fonctions qui ne peuvent pas être appelées à partir d'un autre thread que le thread auquel ils sont associés. C'est pourquoi vous avez votre première erreur à propos de QSocketNotifier.
  • Vous ne pouvez pas créer de QObject à partir d'un thread et lui attribuer un parent associé à un autre thread. C'est votre deuxième erreur.
+0

Code de Serveur est référencé ici [lien] (http://www.bogotobogo.com/Qt/Qt5_QTcpServer_Multithreaded_Client_Server.php), je veux juste envoyer des données à un autre client qui, dans les discussions diffirent, et je essayé d'utiliser socket-> moveToThread (QThread :: currentThread()); mais il montre ce QObject :: moveToThread: thread en cours (0x16415450) n'est pas le thread de l'objet (0x16415550). Impossible de passer au thread cible (0x164154450) QSocketNotifier: Les notificateurs de socket ne peuvent pas être activés ou désactivés à partir d'un autre thread – tobin

+0

Comme je l'ai dit, vous devez appeler 'socket-> moveToThread();' à partir du thread auquel QObject est associé. Donc 'socket-> moveToThread (QThread :: currentThread())' n'a aucun sens puisque ceci n'est valide que si 'socket-> thread()' est déjà 'QThread :: currentThread()'. –

+0

Merci pour votre aide, je ne comprends pas très bien, pourriez-vous me donner un exemple suivre [ce code] (http://www.bogotobogo.com/Qt/Qt5_QTcpServer_Multithreaded_Client_Server.php)? – tobin