Qt同步QNetworkAccessManager获取

8

如何正确地执行同步 QNetworkAccessManager::get ?

Qt Wiki 提供了一种方法,但指出“不建议在实际应用中使用此方法”。邮件列表也提供了与维基类似的解决方案。

2个回答

10

Yum可能使用类似于这样的东西:

QEventLoop loop;
connect(_netReply, SIGNAL(finished()), &loop, SLOT(quit()));
loop.exec();

很好的回答,支持超时功能会更好。 - jpo38

2
在维基和yttrium的回答中提到的简单解决方案非常脆弱,因为它无法处理所有可能的故障场景(例如代理),因此不应在生产环境中使用。不幸的是,这种方法已经变得相当普遍,因此任何要求同步QNAM的人都会被“将其异步使用[愚蠢]”或者这个最终会失败的简单代码所困扰。
我还没有找到Qt团队自己的“正确”解决方案,但是这位codeproject上的人已经足够好心,制作了一个更全面的包装器,应该更加安全:
http://www.codeproject.com/Articles/484905/Use-QNetworkAccessManager-for-synchronous-download

1
我在Python中很容易地完成了这个任务,在GUI和生产系统中也都能正常运行。为什么在Qt中使用QNAM的同步方式不够正式和简便呢? - Raiden Core
1
@RaidenCore,也问同样的问题。这与C++有关吗? - nurgasemetey
1
@RaidenCore,这与C++无关。这是Qt本身的一个(重大)缺陷。没有_好的_理由不能使用预设潜在超时等来进行适当的内联同步下载。这是其中一件事情,在试图提供通用解决方案时,简单和明显的用例变成了噩梦。 - fyngyrz
@RadenCore,接下来,您可以调用外部程序来下载Qt,例如一个简单的Python脚本、wget命令等。这个简单的任务完全没有必要变得如此困难。 - fyngyrz
他们设置同步 I/O “困难”的原因很充分,那就是因为在不应该进行阻塞操作的情况下,它经常被滥用。只需看看 JS,他们甚至已经去掉了同步 API,因为它被过度滥用了。 Qt 使使用事件循环和异步消息传递变得相当容易,但在需要简单的同步 I/O 的情况下(在具有用户交互的大型应用程序中这种情况相当少见),仍然应该提供更多的辅助函数和/或好的示例。 - 1337user

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接