Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/162.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/sockets/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 为什么QNetworkAccessManager查询可以阻止Qt应用程序退出?_C++_Qt_Qtnetwork - Fatal编程技术网

C++ 为什么QNetworkAccessManager查询可以阻止Qt应用程序退出?

C++ 为什么QNetworkAccessManager查询可以阻止Qt应用程序退出?,c++,qt,qtnetwork,C++,Qt,Qtnetwork,如果没有工作的internet连接,则关闭主窗口后,使用QNetworkAccessManager访问internet的Qt应用程序将不会退出 示例应用程序(使用Qt 4.8、MSVC2010、Win7 x64进行测试): #包括 #包括 #包括 int main(int argc,char*argv[]) { 质量保证申请a(argc、argv); QMainWindow主窗口; mainWindow.show(); QNetworkAccessManager*pManager=新的QNetw

如果没有工作的internet连接,则关闭主窗口后,使用QNetworkAccessManager访问internet的Qt应用程序将不会退出

示例应用程序(使用Qt 4.8、MSVC2010、Win7 x64进行测试):

#包括
#包括
#包括
int main(int argc,char*argv[])
{
质量保证申请a(argc、argv);
QMainWindow主窗口;
mainWindow.show();
QNetworkAccessManager*pManager=新的QNetworkAccessManager;
QNetworkReply*pReply=pManager->get(QNetworkRequest(QUrl(
"http://www.google.com")));
pReply->abort();
预先删除;
删除pManager;
//如果没有internet连接,应用程序将保持活动状态
//永远关闭主窗口后。
返回a.exec();
}
我是遗漏了什么还是一个bug?如果是,您建议采取什么措施来确保应用程序退出

编辑:
我必须纠正自己:示例应用程序在关闭主窗口后仅保持活动状态约13秒。如果QApplication对象是使用
new
分配的(在我的实际应用程序中就是这样),它将永远保持活动状态。

有趣的是,QNetworkAccessManager在内部使用线程,这可能与它有关。这里有两件事不同于正常用法a)在事件循环运行之前使用QNAM,b)在返回事件循环之前立即删除reply对象。我想知道,在调用.exec()之后使用QNAM时是否也会出现问题?@Frank Osterfeld是的,如果我将
a.exec()置于QNAM内容之前,也会出现问题。将
QNetworkAccessManager::get
QNetworkReply::abort
分配给主窗口上的按钮不会改变任何事情(这意味着a和b都不是原因)。如果将a.exec()放在QNAM内容之前,情况与初始情况类似:没有事件循环正在运行(不再)。但是如果您通过UI触发它,则有一个,因此这将是正常的用例。我将创建一个最小的测试用例,并将其报告为Qt bug。有趣的是,它在OS X ML和4.8.1下运行良好,听起来像是一个特定于平台的bug。如果我在WinXP虚拟机上运行可执行文件,也不会有这样的延迟。但这并不意味着它是Win7特有的。(例如,我的网络配置可能有些异常)。我简直无法想象我是第一个在Win7机器上使用QNetworkAccessManager的人。
#include <QtGui/QApplication>
#include <QNetworkReply>
#include <QMainWindow>

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QMainWindow mainWindow;
    mainWindow.show();
    QNetworkAccessManager * pManager = new QNetworkAccessManager;
    QNetworkReply * pReply = pManager->get(QNetworkRequest(QUrl(
                                           "http://www.google.com")));
    pReply->abort();
    delete pReply;
    delete pManager;
    // If there is no internet connection, the application will stay alive
    // forever after closing the main window.
    return a.exec();
}