C++ QThread和QTcpServer这是一个好的选择吗?

C++ QThread和QTcpServer这是一个好的选择吗?,c++,multithreading,qt,qtcpserver,C++,Multithreading,Qt,Qtcpserver,这是我在这里的第一篇帖子,我会尽可能地解释我的问题,不要犹豫纠正我,因为我是初学者 我正在使用Qt设计一个GUI来控制3D引擎。 Qt和3D引擎使用QTcpserver进行对话。 我可以向3D引擎发送命令,如“移动对象”或“在场景中列出对象”,引擎将响应 目前,存在两个问题: 1) 当服务器响应时,我不知道这是“移动”函数的响应还是“列表”函数的响应。我在GUI上解析启动事件的答案,但这不是一个合适的解决方案。 2) 在发送命令之前,我调用waitForReadyRead函数,它将阻塞主线程。

这是我在这里的第一篇帖子,我会尽可能地解释我的问题,不要犹豫纠正我,因为我是初学者

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

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

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

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

我没有在这里发布代码,因为我不认为我的问题是“代码相关的”,但如果您要求我这样做,我会很高兴


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

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


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

可能的重复-在这里,我给出了一个完整的、自包含的示例,说明如何设计线程化tcp服务器。不过,我承认这不是一个完美的复制品。所以我的投票结果可能还为时过早。你需要一种将请求和响应关联起来的方法。通常,您将添加一个请求标识符,当收到回复时,您可以在一个包含未决请求的容器中查找该请求,以了解它的用途。请注意,QThread是一个线程控制器。线程数据属于一个单独的类-名义上是QObject,它已被移动到线程中。实际上,我之所以考虑线程,只是因为最初我使用了waitForReadyRead()函数(在clientConnection->write之后立即使用),它阻塞了UI。我知道我不必使用waitForReadyRead,但如果我不使用,3D引擎将无法连接到服务器。它可以正常连接,但您必须将控制权返回到主事件循环才能获取这些事件。Connect不是一个同步函数。它只会启动连接。只有在三方握手完成后才能建立连接。