当前位置:C++技术网 > 资讯 > QNetworkReply 的finished()信号问题

QNetworkReply 的finished()信号问题

更新时间:2016-08-11 11:39:51浏览次数:1+次

QNetworkReply *replyOrg = manager->get(QNetworkRequest(url));
if ( NULL != replyOrg )
{
    connect(replyOrg, SIGNAL(finished()), this, SLOT(OnReadyReadOrg()));
}
这是我的部分代码,我现在的问题是程序运行一段时间后,这个finished()信号就不能收到(我这部分代码是在一个函数中每隔3秒去循环调用的),排查了很久都没找到原因,希望有大神可以帮忙解答下。


C++技术网解答:

    根据描述和代码,此处的功能应该是每隔3秒去请求url对应的数据,返回的的对象用replyOrg指向,如果有数据,表示获取请求的数据完成,就会发送信号SIGNAL(finished()),同时会调用OnReadyReadOrg()执行。而运行一段时间后,发现收不到信号,即回调函数OnReadyReadOrg()没有执行。应该来说,开始是能够正常收到信号的,只是过了一段时间开始收不到信号了。

    对于获取数据,总有获取失败的时候。所以replyOrg很可能会为NULL,这是很正常的。然而代码里并没有写else的检测场景,所以是不完整的。这样至少可以知道,是获取数据为空,所以没有触发信号。完整的代码如下:

QNetworkReply *replyOrg = manager->get(QNetworkRequest(url));
if ( NULL != replyOrg )
{
    connect(replyOrg, SIGNAL(finished()), this, SLOT(OnReadyReadOrg()));
}
else
{
    //打印日志,提示没有获取到数据
}
     既然开始能够正常获取,而运行一段时间后不能正常获取数据,这表明信号槽部分代码是没有大问题的。问题应该发生在获取请求数据的地方。所以要检查第一行代码的执行情况。

    特别注意,网络接口调用太频繁,通常都会被限制,有可能是请求太频繁之后,服务器拒绝请求,所以请求不到数据,和提问中描述的现象比较像。

    所以,问题应该在获取数据的地方,请仔细调试跟踪获取数据的状态,问题应该是好找的。如果有获取请求数据返回的http头信息,问题就好说了。先确保获取到数据,然后才是检查信号槽的正确工作。这是有流程先后的,所以后面的步骤一定要建立在前面步骤可靠的结果之上的。这是调试的基本技巧。