节目结束后网络回复

Posted

技术标签:

【中文标题】节目结束后网络回复【英文标题】:Network reply after program ends 【发布时间】:2014-08-09 15:07:13 【问题描述】:

我编写了从 url 获取网页源代码的程序,但我遇到了问题,因为当程序结束时,此代码会打印在屏幕上,我无法使用我下载的数据。我认为问题在于程序等待 SIGNAL(finished())。在结束之前有什么方法可以在我的程序中处理下载的数据?

void Get::getCode()

    networkManager = new QNetworkAccessManager(this);
    link = "http://example.com/";
    networkManager->get(QNetworkRequest(QUrl(link)));
    connect(networkManager, SIGNAL(finished(QNetworkReply*)), &process, SLOT(replyFinished(QNetworkReply*)));

    //QDesktopServices::openUrl(QUrl(link));

...

    void Process::replyFinished(QNetworkReply* pReply)

    QString source(pReply->readAll());
    printf("%s\n", source.toStdString().c_str());

...

int main(int argc, char *argv[])

    QApplication a(argc, argv);

    Get get; get.getCode();
    MainWindow window;

    printf("test point\n");

    return a.exec();
    //return 0;

“测试点”首先出现在屏幕上,然后是 html 代码。

【问题讨论】:

您可以将其写入文件吗? 我想在同一个程序中使用这个代码并且不需要写入文件,足够我在 QString 源中写入数据,但是我不能在程序中使用这个变量,因为它在程序结束时获取数据。 【参考方案1】:

网络管理器异步运行,这意味着您的主线程在调用 get() 方法后立即继续。

您可以通过设置一个等待下载完成的事件循环来解决此问题:

  QEventLoop loop;
  connect(networkManager, SIGNAL(finished()), &loop, SLOT(quit()));
  loop.exec(QEventLoop::ExcludeUserInputEvents);

这应该会给你预期的结果。

【讨论】:

非常感谢,您的代码解决了一半的问题,但我对您的代码有一些疑问。为什么你使用 SLOT(quit())? exec(QEventLoop::ExcludeUserInputEvents) 是什么意思?我也有奇怪的情况,当我使用包含“循环”的函数时,屏幕上总是会打印:“QObject::connect: No such signal QNetworkAccessManager::finished() in...”但之后程序正常工作。最糟糕的是,我仍然无法访问从其他功能下载的数据。 quit() 槽用于在网络管理器完成下载后停止事件循环。否则你的程序会在 loop.exec() 调用中永远挂起。 exec() 调用启动本地事件循环。 QEventLoop::ExcludeUserInputEvents 参数告诉您的本地事件循环不处理任何用户输入,例如鼠标/键盘输入。一旦你的本地事件完成,这些输入将被传递到主事件循环,这是你想要的这样一个网络处理事件循环。

以上是关于节目结束后网络回复的主要内容,如果未能解决你的问题,请参考以下文章

在 discord.py 中完成后如何跳过或结束关键字命令?

TCP Retransmission重新传送超过5次后还没收到回复会怎么办?

老师见打系列:我只是写了一个自动回复讨论的脚本~

节点传播能力的测量

微信关注后自动回复,根据关键字回复

如何只回复我们的网络表单