2010-09-07 100 views
2

在我的应用程序中,我正在解析一个xml文件并使用xsd模式验证内容。当xml文件变大时,解析文件和验证内容需要一些时间。在这种情况下,我想要使用进度条可视化解析和验证阶段。这个怎么做?编码进度条建议

注:我使用Qt和C++

+0

另请参阅此问题:http://stackoverflow.com/q/3626946/362638 – 2010-09-07 14:48:18

回答

0

你是什么算法的主要循环结构?

如果您单次通过文档,您可能不知道何时达到最终目的,为了获得良好的进度表,您可能需要切换到两次执行 - 这可能会速度会变慢,但会带来反馈优势。

+0

您能否解释两遍实现? – onurozcelik 2010-09-07 13:33:23

+0

基本上这意味着你会解析整个文档一次,并累积你知道你将要处理的节点数量,然后在第二遍你实际上做了处理,但现在你知道会有多少,所以你可以出示仪表。 – Randy 2010-09-07 15:52:03

3

基本上你只需创建一个QProgressDialog实例:

QProgressDialog progress("Parsing...", "Abort", 0, numOperations, this); 
progress.setWindowModality(Qt::WindowModal); 

其中numOperations是你所需要的分析完成之前做的事情完整号码。为此,您可能需要首先快速传递数据,您只需计算要解析的元素的总数或类似数据,并将该值设置为前面示例代码中的最大值numOperations。然后你做出实际处理途径和定期调用setValue方法:

progress.setValue(finishedOperations); 

其中finishedOperations是事物到目前为止解析的数量。

这假设您想要最简单的解决方案,其中进度栏显示为单独的模式对话框。如果您想让用户有机会中止此过程,则需要实施一个连接到canceled() signal的插槽。

如果您不想在模态对话框中显示进度条,您只需在某处显示QProgressBar。它通过定期调用setValue()以类似的方式工作。

1

假设xml解析实现从附加到文件读取器的某种缓冲流中提取数据 - 读取文件大小,然后每当输入缓冲区从文件读取器中抓取另一个块时,更新进度指示符。这可以通过从文件读取器类派生一个新类并覆盖读取块函数来报告进度,从而可以非常方便地完成。

这种方法的好处是它不需要你做预分析的额外工作来估计操作的数量,并且可以用于任何类型的流文件处理方案,无论是xml还是其他格式。