QT进程write函数后有一定概率接收到More?消息,TCP的flush()函数

使用QT的进程调用windows的命令行工具时,偶尔会出现写入命令后接收到More?消息,并且没有达到预期的效果。

我需要发送两个命令给cmd进程,有概率接收到More?,刚开始以为是两次发送命令之间的间隔太短,处理不过来,尝试在发送第一次命令后将线程sleep1s,问题没得到解决。后来考虑到是不是最后一次命令发出后,进程还没来得及处理,我就把进程给关闭并且delete了,依旧尝试在发送第二次命令之后将线程sleep5s,问题没得到解决,并且在sleep5s后,才会产生预期的动作,说明这个sleep5s是没有用的,有用的话5s的时间足够其产生预期的动作。chatgtp:

/*
 * 在Qt中,QProcess::write() 函数用于向外部进程写入数据。然而,这个函数并不会阻塞,它会立即返回,
 * 而实际上数据并没有立即从网络接口发送出去。如果你频繁调用 write(),数据会被写入缓冲区
 * 只有当频率降低到一定值时,数据才会真正发送
 */

 了解到可以****使用 waitForReadyRead() 等待进程的输出。尝试,问题得到解决。

按照其给的解释,这个问题和上次使用TCP/IP进行传输的时候有相似的问题,在QT窗口关闭时对已经连接得TCP/IP服务器发送信号以通知其进行某些动作,随后QT窗口关闭(同时断开TCP/IP连接删除套接字),但是关闭后服务器并没有接收到来自QT窗口的信号。这里有相似的问题,即write函数只是写入缓冲器,得等到某个时机才发送出去,我在write相关数据给TCP服务器时,应该是写入缓冲器,实际并没有发送,还未等到计算机把数据发送出去,QT窗口就已经关闭并断开了TCP连接,导致服务器未接收到。解决的办法就是使用flush函数,使用flush刷新缓冲区,立即把缓冲区的数据发送到底层网络套接字。

进程这里没有flush函数,使用了waitForReadyRead进行等待。之前使用sleep阻塞线程没有用,ChatGPT说,只有当频率降低到一定值时,数据才会真正发送。亲测有效

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值