【发布时间】:2011-04-09 04:13:46
【问题描述】:
在我的应用程序中,我正在解析一个 xml 文件并使用 xsd 模式验证内容。当 xml 文件变大时,解析文件和验证内容需要一些时间。在这种情况下,我想用进度条可视化解析和验证阶段。如何做到这一点?
注意:我正在使用 Qt 和 C++
【问题讨论】:
标签: c++ qt progress-bar xml-parsing
在我的应用程序中,我正在解析一个 xml 文件并使用 xsd 模式验证内容。当 xml 文件变大时,解析文件和验证内容需要一些时间。在这种情况下,我想用进度条可视化解析和验证阶段。如何做到这一点?
注意:我正在使用 Qt 和 C++
【问题讨论】:
标签: c++ qt progress-bar xml-parsing
基本上你只需创建一个QProgressDialog 实例:
QProgressDialog progress("Parsing...", "Abort", 0, numOperations, this);
progress.setWindowModality(Qt::WindowModal);
其中numOperations 是在解析完成之前您需要做的全部事情。为此,您可能需要对数据进行第一次快速传递,您只需计算要解析的元素总数或类似的东西,并将此值设置为前面示例代码中的最大值numOperations。然后让实际的处理通过并定期调用 setValue:
progress.setValue(finishedOperations);
finishedOperations 是到目前为止已解析的事物的数量。
这是假设您想要最简单的解决方案,其中进度条显示为单独的模式对话框。如果你想让用户有机会中止进程,你需要实现一个连接到canceled() signal的槽。
如果您不想在模式对话框中显示进度条,您只需在某处显示QProgressBar。它通过定期调用 setValue() 以类似的方式工作。
【讨论】:
假设 xml 解析实现是从附加到文件读取器的某种缓冲流中提取其数据——读取文件大小,然后每次输入缓冲区从文件读取器中获取另一个块时,更新您的进度指示器.这可能通过从文件阅读器类派生一个新类并覆盖读取块函数以报告进度来最方便地完成。
这种方法的优点是它不需要您为预解析做额外的工作来估计操作数量,并且可以与任何类型的流文件处理方案一起使用,无论是 xml 还是任何其他格式.
【讨论】:
你的算法的主要循环结构是什么?
如果您正在单次通过文档,您可能不知道何时即将结束,为了获得良好的进度表,您可能需要切换到两次通过实现 - 这可能是速度较慢,但提供反馈优势。
【讨论】: