gpt4 book ai didi

c++ - 同步单个文件下载 - 它是 GUI Qt 应用程序中的正确方法吗?

转载 作者:行者123 更新时间:2023-11-30 01:46:42 25 4
gpt4 key购买 nike

我正在为我在 Qt 中的应用程序开发一个更新程序,主要是为了了解框架(我知道有多种现成的解决方案可用,这与此处无关)。它是一个基本的 GUI 应用程序,使用 QMainWindow 子类作为其主窗口,并使用 MyAppUpdater 类来执行实际的程序逻辑。

更新信息(版本、变更日志、要下载的文件)作为 XML 文件存储在我的服务器上。更新程序在设置 UI 后应该做的第一件事是查询该服务器、获取 XML 文件、解析它并向用户显示信息。不过,这是我遇到问题的地方;来自程序/C 背景,我会启动一个同步下载,设置一个大概 3 秒的超时,然后看看会发生什么 - 如果我设法正确下载文件,我会解析它并继续,否则显示错误。

但是,看到在 Qt 中实现这样的东西有多么不方便,我开始相信它的网络类是以不同的方式设计的,考虑了不同的方法。

我正在考虑在 InitVersionInfoDownload 中启动异步下载,然后将 QNetworkReply 的 finished 信号连接到名为 VersionInfoDownloadComplete,或类似的内容。我还需要一个计时器来实现超时检查——如果 slot 在 3 秒后没有被调用,更新应该被中止。但是,这种方法似乎过于复杂并且通常不适合这种情况;如果不从服务器检索此文件,我无法继续,或者在等待下载文件时确实无法执行任何操作,因此异步方法通常似乎不合适。我是不是弄错了,还是有更好的方法?

最佳答案

TL;DR:这在任何 GUI 应用程序中都是错误的方法。

how inconvenient something like that is to implement in Qt

这并不是为了方便,因为每当我看到有这种行为的出货产品时,我就有一种与开发人员进行严厉交谈的冲动。阻止 GUI 是可用性的噩梦。你永远不想那样编码。

coming from a procedural/C background, I'd initiate a synchronous download, set a timeout of maybe 3 seconds, then see what happens

如果您用 C 编写任何类型的机器或接口(interface)控制代码,您可能不希望它是同步的或者。您将设置一个状态机并异步处理所有内容。在编写嵌入式 C 应用程序时,状态机使困难的事情变得微不足道。有几种解决方案,QP/C将是一流的例子。

was thinking about initiating an asynchronous download in, say, InitVersionInfoDownload, and then connecting QNetworkReply's finished signal to a slot called VersionInfoDownloadComplete, or something along these lines. I'd also need a timer somewhere to implement timeout checks - if the slot is not invoked after say 3 seconds, the update should be aborted. However, this approach seems overly complicated

这是微不足道的。如果不显示您的代码,您就无法讨论这些事情:也许您已经以某种非常冗长的方式实现了它。如果做得正确,它应该看起来又瘦又甜。如需一些灵感,请参阅 this answer .

I cannot proceed without retrieving this file from the server, or indeed do anything while waiting for it to be downloaded

这显然是错误的。您的用户可能希望取消更新并退出您的应用程序,或者调整其窗口大小,或者最小化/最大化它,或者检查现有版本,或者操作系统可能需要重新绘制窗口,或者......

请记住:您的用户和环境都在控制之中。设计无响应的应用程序不仅会带来糟糕的用户体验,还会使您的代码更难理解和测试。伪同步意大利面很快就会失控。通过异步设计,使用信号 spy 或其他产品来反省应用程序正在做什么、卡在哪里等是微不足道的。

关于c++ - 同步单个文件下载 - 它是 GUI Qt 应用程序中的正确方法吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32744665/

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