qt waitforreadyread()不一致?

时间:2015-04-10 03:17:35

标签: c++ qt

根据Qt 4.7.1,OS X 10.6.8 (必须使用此 - 更高版本 Qt和/或OS X的引入严重 我的用户不兼容)

以下作品。有时。然后有时不会。 如果它不起作用,它将返回“未知错误”

hst在所有情况下都很好,qDebug返回相同的正确值 每次都是hst的数据。

这个想法是,使用 - >来获取CGI URL; CGI 返回一些数据,在这种情况下我可以忽略。 然后我就完成了。

hst是一个格式正确的网址,

http://yadda.com/cgi-bin/whatever.py

QString hst;
QNetworkReply *qnr;
QNetworkAccessManager *qqnap = NULL;

qqnap = new(std::nothrow) QNetworkAccessManager(tmw);
if (qqnap != NULL)
{
    hst = loaduphst(); // get qstring to send
    qnr = qqnap->get(QNetworkRequest(QUrl(hst))); // report in and fetch update info
    if (qnr->waitForReadyRead(3000) == FALSE)
    {
        qDebug() << "waitForReadyRead() returned FALSE -- error or timeout:" << qnr->errorString();
    }
}
else
{
    qDebug() << "qqnap is NULL";
}

yadda.com上涨;目标脚本很简单 并且每次都可以在浏览器或cmd行中正常工作。

这是在上下文中运行的 MainWindow :: closeEvent(QCloseEvent * ce) 在我发出ce-&gt;之前接受()GUI仍在运行, 等

提示?提示?滥用?谢谢!

2 个答案:

答案 0 :(得分:2)

waitForReadyRead未在QNetworkReply中实施。 default implementation无效:

bool QIODevice::waitForReadyRead(int msecs)
{
    Q_UNUSED(msecs);
    return false;
}

使用readyRead信号找出何时可以读取数据。

答案 1 :(得分:1)

在主GUI循环的上下文中,或多或少同步使用异步网络是非常有问题的。不会出现的信号(已完成或已准备好阅读),有时会发送但有时不会发送的网址......当然,正如上面所说的那样,未实现的功能。斑马!

但是,我们可以做的是自己启动事件循环和计时器,这将以一种或多或少的友好方式同步。

也许一些可怜的灵魂需要像我一样捅一个网站CGI;这是代码。有用。至少在Qt 4.7.1下它确实如此!

所以无论如何,这里是:

QNetworkReply *qnr;
QNetworkAccessManager *qqnap;
QNetworkRequest qnwr;
QEventLoop w;
QTimer arf;

if ((qqnap = new(std::nothrow) QNetworkAccessManager(this)))
{
    qnwr.setUrl(myUrl());                                       // Build web goodness
    qnwr.setRawHeader("User-Agent", myUserAgent());

    arf.setSingleShot(true);

    if (connect(&arf,  SIGNAL(timeout()),                       // timer firing blows...
                &w,    SLOT(quit())                             // ...out event loop
       ) == FALSE)
       { return(BAD_CONNECT_TOUT); }

    if (connect(qqnap, SIGNAL(finished(QNetworkReply*)),        // notify we finished...
                this,  SLOT(qqnapReplyQ(QNetworkReply*))        // ...cuz I need to know
       ) == FALSE)
       { return(BAD_CONNECT_FINISHED_NOTIFY); }

    if (connect(qqnap, SIGNAL(finished(QNetworkReply*)),        // finishing blows out...
                   &w, SLOT(quit())                             // ...event loop
       ) == FALSE)
       { return(BAD_CONNECT_FINISHED_ELOOP); }

    if ((qnr = qqnap->get(qnwr)))                               // Go if qnr is good
    {
        arf.start(6000); // timeout in ms                       // Watchdog timer on
        w.exec();                                               // handle all that
        if (arf.isActive()) { arf.stop(); }                     // kill timer if needed
    }
    else { return(BAD_WWWGET); }                                // FAIL
}
else
{
    return(BAD_NWAM);                                            // FAIL
}
return(ZEN_NETWORKING);