2017-01-16 14 views
0

Я пытаюсь создать многопоточный игровой сервер, использующий QT, поэтому каждый клиент является автономным потоком «QThread». Теперь мне нужно отправить данные другим клиентам (в другой теме), которая находится в той же игровой комнате. Например, когда домовладелец закрыл игровой зал, игровой сервер должен отправить в «room_closed» сообщения других клиентов whichs в том же SOOM, но есть ошибка:QSocketNotifier: оповещения сокета не могут быть включены или отключены из другого потока

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

пс: Я судимый для использования синусов/слотов, но все еще есть ошибка:

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)

Что мне делать?

ответ

1

Кажется, что вы не обрабатываете QObjects и QThreads правильно, и Qt жалуется на это.

Я предлагаю вам взглянуть на Qt документации:

Краткое руководство:

  • Каждый экземпляр QObject связан с QThread (QObject::thread()).
  • Вы можете изменить связанный поток с помощью QObject::moveTothread(), но QObject не должен иметь родителя, и вызов должен быть сделан из потока, с которым связан QObject.
  • Некоторые QObject (os sub classes) имеют функции, которые нельзя вызвать из другого потока, кроме потока, с которым они связаны. Вот почему у вас есть первая ошибка в QSocketNotifier.
  • Вы не можете создать QObject из потока и предоставить ему родительский элемент, связанный с другим потоком. Это ваша вторая ошибка.
+0

код сервера, упоминается здесь [ссылка] (http://www.bogotobogo.com/Qt/Qt5_QTcpServer_Multithreaded_Client_Server.php), я просто хочу, чтобы отправить данные на другой клиент, который в ти различных потоков, и я попробовал использовать socket-> moveToThread (QThread :: currentThread()); но он показывает этот QObject :: moveToThread: Current thread (0x16415450) не является потоком объекта (0x16415550). Невозможно перейти к целевой теме (0x164154450) QSocketNotifier: оповещения сокета нельзя включить или отключить из другого потока – tobin

+0

Как я уже сказал, вам нужно вызвать 'socket-> moveToThread();' из потока, с которым связан QObject. Поэтому 'socket-> moveToThread (QThread :: currentThread())' не имеет никакого смысла, поскольку это справедливо только в том случае, если 'socket-> thread()' уже 'QThread :: currentThread()'. –

+0

Спасибо за вашу помощь, я не совсем понимаю, не могли бы вы привести мне пример, следующий за [этот код] (http://www.bogotobogo.com/Qt/Qt5_QTcpServer_Multithreaded_Client_Server.php)? – tobin