c++ - Qt中的异步函数调用

标签 c++ qt asynchronous

我对 Qt 和编程还很陌生,遇到了一个我找不到解决方案的问题。

我想从在线 XML 文件中读取一些信息并将其发送到我的主程序。

为此,我创建了一个类 XMLParser 并将以下内容添加到构造函数中:

XMLParser::XMLParser(QString searchstring)
{
    QNetworkAccessManager *manager2 = new QNetworkAccessManager(this);
    reply = manager2->get(QNetworkRequest(QUrl("http://www.boardgamegeek.com/xmlapi/search?search="+searchstring)));

    XMLParser::connect(reply, SIGNAL(finished()),
                   this, SLOT(fileIsReady()) );
}

fileIsReady填充一个QMap并将其存储为私有(private)类成员。

在我的第二节课上,我打电话

  XMLParser *xmlpars = new XMLParser(input_gamename->text());
  QMap<QString, int> searchResults = xmlpars->getSearchList();

getSearchList 是一个简单的 getter 函数。

问题是,getSearchList 在 fileIsReady 完成读取 XML 文件并返回空映射之前执行。 据我了解,在 fileIsReady() 完成其工作之前,构造函数不应完成。因此,不应提前调用 getSearchList()。

我的两个问题:

  1. 为什么我的程序在运行,而函数没有读完。
  2. 如何让第二次调用“getSearchList”等待?

提前致谢!

最佳答案

首先,您需要了解信号和槽的基本概念。

建立连接后,每次发出信号时都会调用插槽。

connect() 函数在将信号连接到插槽后返回。它不会等待信号发出。

在您的 XMLParser 构造函数中,您的 connect() 函数注册了这个:“当 finished() 信号发出时,运行 fileIsReady() 功能"。

现在,回答您的问题。

  1. Why does my programm progresses while the function didn't finish reading.

因为在您的构造函数代码中,您要求构造函数在将信号连接到插槽后完成。您没有要求它等待下载完成。

然后,您无需等待 finished() 信号即可调用 getSearchList()。因此,getSearchList() 在 fileIsReady() 之前被调用。

  1. How can I make the second call "getSearchList" wait?

正如 MrEricSir 所说,您不应该让它等待! (想一想:如果您失去互联网连接并且无法完成文件下载会怎样?答案是,您的程序将卡住,因为它将永远等待。这很糟糕。)

不要在构造 XMLParser 后立即调用 getSearchList()。相反,让 XMLParser 在完成解析 XML 文件时发出“finishedParsing()”信号。然后,进行另一个信号槽连接:将 finishedParsing() 信号连接到调用 getSearchList() 的槽。

关于c++ - Qt中的异步函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27028190/

相关文章:

c# - 任务中的异步套接字操作

c++ - QT 应用程序的图标

c++ - 编写类似netstat的程序

c++ - Qt 中的事件处理程序

c++ - cin.get 和 char 错误信息

c++ - 关于 Connect 之前我应该​​拥有什么的问题

Qt 应用程序在启动时运行时无法创建托盘图标

node.js - 关于nodejs线程的一些困惑

javascript - 如何知道 npm `unzip` 模块何时完成解压缩文件?

C++模板模板参数