同步单个文件下载 - 它是 GUI Qt 应用程序中的正确方法吗?
Synchronous single file download - is it the right approach in a GUI Qt application?
我正在为我在 Qt 中的应用程序开发一个更新程序,主要是为了了解框架(我知道有多种现成的解决方案可用,这与此处无关)。它是一个基本的 GUI 应用程序,使用 QMainWindow
subclass 作为其主要 window 和 MyAppUpdater
class 来执行实际的程序逻辑.
更新信息(版本、变更日志、要下载的文件)作为 XML 文件存储在我的服务器上。更新程序在设置 UI 后应该做的第一件事是查询该服务器,获取 XML 文件,解析它并向用户显示信息。不过,这是我遇到问题的地方;来自 procedural/C 背景,我会启动同步下载,设置可能为 3 秒的超时,然后看看会发生什么 - 如果我设法正确下载文件,我将解析它并继续,否则显示错误。
但是,看到在 Qt 中实现这样的东西有多么不方便,我开始相信它的网络 classes 是以不同的方式设计的,考虑了不同的方法。
我正在考虑在 InitVersionInfoDownload
中启动一个异步下载,然后将 QNetworkReply's
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 编写任何类型的机器或接口控制代码,您可能不希望它是同步的或者。您将设置一个状态机并异步处理所有内容。在编写嵌入式 C 应用程序时,状态机使困难的事情变得微不足道。有几种解决方案,QP/C 将是第一个 class 示例。
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
这是微不足道的。如果不显示您的代码,您就无法讨论这些事情:也许您已经以某种非常冗长的方式实现了它。如果做得正确,它应该看起来又瘦又甜。如需一些灵感,请参阅 。
I cannot proceed without retrieving this file from the server, or indeed do anything while waiting for it to be downloaded
这显然是错误的。您的用户可能希望取消更新并退出您的应用程序,或调整其 window 或 minimize/maximize 的大小,或检查现有版本,或者 OS 可能需要 window 重绘,或 ...
记住:您的用户和环境都在控制之中。设计无响应的应用程序不仅会带来糟糕的用户体验,还会使您的代码更难理解和测试。伪同步意大利面很快就会失控。使用异步设计,使用信号间谍或其他产品来反省应用程序正在做什么、它卡在哪里等是微不足道的。
我正在为我在 Qt 中的应用程序开发一个更新程序,主要是为了了解框架(我知道有多种现成的解决方案可用,这与此处无关)。它是一个基本的 GUI 应用程序,使用 QMainWindow
subclass 作为其主要 window 和 MyAppUpdater
class 来执行实际的程序逻辑.
更新信息(版本、变更日志、要下载的文件)作为 XML 文件存储在我的服务器上。更新程序在设置 UI 后应该做的第一件事是查询该服务器,获取 XML 文件,解析它并向用户显示信息。不过,这是我遇到问题的地方;来自 procedural/C 背景,我会启动同步下载,设置可能为 3 秒的超时,然后看看会发生什么 - 如果我设法正确下载文件,我将解析它并继续,否则显示错误。
但是,看到在 Qt 中实现这样的东西有多么不方便,我开始相信它的网络 classes 是以不同的方式设计的,考虑了不同的方法。
我正在考虑在 InitVersionInfoDownload
中启动一个异步下载,然后将 QNetworkReply's
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 编写任何类型的机器或接口控制代码,您可能不希望它是同步的或者。您将设置一个状态机并异步处理所有内容。在编写嵌入式 C 应用程序时,状态机使困难的事情变得微不足道。有几种解决方案,QP/C 将是第一个 class 示例。
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
这是微不足道的。如果不显示您的代码,您就无法讨论这些事情:也许您已经以某种非常冗长的方式实现了它。如果做得正确,它应该看起来又瘦又甜。如需一些灵感,请参阅
I cannot proceed without retrieving this file from the server, or indeed do anything while waiting for it to be downloaded
这显然是错误的。您的用户可能希望取消更新并退出您的应用程序,或调整其 window 或 minimize/maximize 的大小,或检查现有版本,或者 OS 可能需要 window 重绘,或 ...
记住:您的用户和环境都在控制之中。设计无响应的应用程序不仅会带来糟糕的用户体验,还会使您的代码更难理解和测试。伪同步意大利面很快就会失控。使用异步设计,使用信号间谍或其他产品来反省应用程序正在做什么、它卡在哪里等是微不足道的。