gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 01:16:15 28 4
gpt4 key购买 nike

我对 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/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com