【问题标题】:QThread and QTcpServer is that a good choice?QThread 和 QTcpServer 是一个不错的选择吗?
【发布时间】:2014-03-17 17:52:20
【问题描述】:

这是我在这里的第一篇文章,我会尽力解释我的问题,不要犹豫,纠正我,因为我是初学者。

我正在使用 Qt 设计一个 GUI 来控制 3D 引擎。 Qt 和 3D 引擎使用 QTcpserver 进行通信。 我可以向 3D 引擎发送命令,例如“移动对象”或“列出场景中的对象”,引擎会回答。

目前有两个问题: 1)当服务器响应时,我不知道这是来自“移动”功能还是“列表”功能的响应。我在 GUI 上解析启动事件的答案,但这不是一个合适的解决方案。 2)在发送命令之前,我调用了waitForReadyRead函数,它阻塞了主线程。 这就是我在这里发帖的原因。

我想到了一个解决方案:一个线程,其中包含一个命令列表和要调用的函数的指针。当我点击一个 UI 按钮时,它会将命令发送到带有正确函数指针的列表,并且线程将尝试清空列表发送命令到服务器。

但我真的不知道这是否是解决我的问题的好方法。 我对 QTcpServer 和 QThread 了解不多,我阅读了很多文章,它们一起用于处理多个客户端连接,但这对我没有帮助。

我没有在此处发布代码,因为我认为我的问题与“代码相关”无关,但如果您提出要求,我很乐意这样做。

感谢您为我指明正确的方向。

【问题讨论】:

  • How to make a threaded network server in Qt? 的可能副本 - 在那里,我给出了一个完整的、独立的示例,说明如何设计线程 tcp 服务器。不过,我承认这不是完美的复制品。所以我的近距离投票可能还为时过早。
  • 您需要一种关联请求和响应的方法。通常,您将添加一个请求标识符,并且在获得回复时,您可以在待处理请求的容器中查找该请求以了解它的用途。请注意,QThread 是一个线程控制器。线程数据属于一个单独的类 - 名义上 QObject 已被移动到一个线程。

标签: c++ multithreading qt qtcpserver


【解决方案1】:

QTcpSocket 上的操作被设计为异步的。不要试图将它用作同步对象——这不是这个类的设计方式。当然,您可以创建一个单独的线程在那里进行处理,但简单地通过套接字发送命令并不能保证线程的开销。

http://qt-project.org/doc/qt-5/qabstractsocket.html

查看发出的信号,包括来自 QIODevice 的 readyRead()。创建一个插槽来处理您的数据并将其连接到该信号。您还应该处理其他情况,包括错误处理信号和处理连接/断开状态。

【讨论】:

  • 实际上,我考虑线程只是因为最初我使用了 waitForReadyRead() 函数(紧接在 clientConnection->write 之后)并且它阻塞了 UI。我知道我不应该使用 waitForReadyRead,但是当我不使用时,3D 引擎将无法连接到服务器。
  • 它会很好地连接,但是您必须将控制权返回给主事件循环才能获取这些事件。 Connect 不是同步函数。它只启动连接。仅在 3 次握手完成后建立连接。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2011-07-07
  • 1970-01-01
  • 2012-11-04
  • 1970-01-01
  • 2011-08-21
  • 1970-01-01
  • 2012-02-13
相关资源
最近更新 更多