QSocketNotifier:无法从另一个线程启用或禁用套接字通知程序
QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread
我尝试构建一个使用 QT 的多线程游戏服务器,因此,每个客户端都是一个基于独立线程的 "QThread"。现在我需要将数据发送到同一线程中的其他客户端(在其他线程中)游戏厅。例如,当房主关闭游戏房间时,游戏服务器需要向同一个房间的其他客户端发送"room_closed"消息,但出现错误:
QSocketNotifier: Socket notifiers cannot be enabled or disabled from
another thread
ps:我尝试使用sinals/slots,但仍然出现错误:
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)
我该怎么办?
您似乎没有正确处理 QObjects 和 QThreads,Qt 抱怨它。
我建议你看一下 Qt 文档:
快速指南:
- QObject 的每个实例都与一个 QThread (
QObject::thread()
) 关联。
- 您可以使用
QObject::moveTothread()
更改其关联的线程,但 QObject 不能有父级并且必须从 QObject 当前关联的线程进行调用。
- 某些 QObject (os sub 类) 具有无法从与它们关联的线程之外的其他线程调用的函数。这就是为什么您遇到关于 QSocketNotifier 的第一个错误。
- 您不能从一个线程创建一个 QObject 并给它一个与另一个线程关联的父对象。那是你的第二个错误。
您在多个线程中调用了 QTcpSocket::write。我用 signal/slot.
解决了这个问题
我尝试构建一个使用 QT 的多线程游戏服务器,因此,每个客户端都是一个基于独立线程的 "QThread"。现在我需要将数据发送到同一线程中的其他客户端(在其他线程中)游戏厅。例如,当房主关闭游戏房间时,游戏服务器需要向同一个房间的其他客户端发送"room_closed"消息,但出现错误:
QSocketNotifier: Socket notifiers cannot be enabled or disabled from another thread
ps:我尝试使用sinals/slots,但仍然出现错误:
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)
我该怎么办?
您似乎没有正确处理 QObjects 和 QThreads,Qt 抱怨它。
我建议你看一下 Qt 文档:
快速指南:
- QObject 的每个实例都与一个 QThread (
QObject::thread()
) 关联。 - 您可以使用
QObject::moveTothread()
更改其关联的线程,但 QObject 不能有父级并且必须从 QObject 当前关联的线程进行调用。 - 某些 QObject (os sub 类) 具有无法从与它们关联的线程之外的其他线程调用的函数。这就是为什么您遇到关于 QSocketNotifier 的第一个错误。
- 您不能从一个线程创建一个 QObject 并给它一个与另一个线程关联的父对象。那是你的第二个错误。
您在多个线程中调用了 QTcpSocket::write。我用 signal/slot.
解决了这个问题