当主线程无限循环运行时,服务器没有收到用 QTcpSocket::write 写入的字节?

Posted

技术标签:

【中文标题】当主线程无限循环运行时,服务器没有收到用 QTcpSocket::write 写入的字节?【英文标题】:Bytes written with QTcpSocket::write has not been received by server when Main Thread running in infinite loop? 【发布时间】:2013-02-27 14:23:25 【问题描述】:

我正在开发一个与服务器交互的应用程序。

在启动时,它正在从数据库中加载一些数据,当数据库大小很大时,应用程序会在很长的循环中运行,假设我在 db 中有 10 条 lac 记录,并且循环将迭代 10 次 lac 次。

在一段固定的时间间隔(由用户设置)之后,比如说 1 秒,我的应用程序正在不同线程中向服务器发送心跳消息。

在正常情况下,它工作正常,但是当应用程序在长循环中运行时,虽然QTcpSocket::write() 返回的写入字节与我正在写的相同(成功),但服务器没有收到心跳消息,但tcpDump 是没有显示收到的任何字节。

我用过

tcpSocket->setSocketOption(QAbstractSocket::LowDelayOption , 1); 
tcpSocket->setSocketOption(QAbstractSocket::KeepAliveOption , 600);

【问题讨论】:

***.com/questions/9714913/… 【参考方案1】:

尝试在循环中添加processEvents()(假设每 1000 个循环或每 100 毫秒)以保持应用程序响应。当然,如果你遇到这样的问题,这是糟糕设计的标志。考虑重新设计您的应用程序以使用多个线程,即主线程和用于长操作(您的循环)的工作线程。更多关于 Qt 线程支持的信息可以在here找到。

【讨论】:

感谢您的建议,现在我正在单独的线程中处理下载/上传数据,它工作得很好。再次感谢。

以上是关于当主线程无限循环运行时,服务器没有收到用 QTcpSocket::write 写入的字节?的主要内容,如果未能解决你的问题,请参考以下文章

当主线程等待它运行时,Alamofire 从不调用 encodingCompletion 以使用 MultipartFormData 上传

从管道读取的无限循环线程进入 timed_waiting

Qt如何获取一个无限循环程序的不断更新的标

如何将运行无限循环的线程限制为 1 个核心?

如何在 C# 中运行可变数量的并发参数化无限循环类型的线程?

每个循环可能会或可能不会运行 CDialog 的无限线程