C++ 编码进度条建议

C++ 编码进度条建议,c++,qt,progress-bar,xml-parsing,C++,Qt,Progress Bar,Xml Parsing,在我的应用程序中,我解析一个xml文件并用xsd模式验证内容。当xml文件变大时,解析文件和验证内容需要一些时间。在本例中,我希望使用进度条可视化解析和验证阶段。如何做到这一点 注释:我使用Qt与C++ 算法的主要循环结构是什么? 如果您只浏览了一次文档,您可能不知道什么时候就要结束了,为了获得一个好的进度表,您可能需要切换到两次执行-这可能会比较慢,但会提供反馈优势。基本上,您只需创建一个实例: QProgressDialog progress("Parsing...", "Abort",

在我的应用程序中,我解析一个xml文件并用xsd模式验证内容。当xml文件变大时,解析文件和验证内容需要一些时间。在本例中,我希望使用进度条可视化解析和验证阶段。如何做到这一点


<>注释:我使用Qt与C++

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


如果您只浏览了一次文档,您可能不知道什么时候就要结束了,为了获得一个好的进度表,您可能需要切换到两次执行-这可能会比较慢,但会提供反馈优势。

基本上,您只需创建一个实例:

QProgressDialog progress("Parsing...", "Abort", 0, numOperations, this);
progress.setWindowModality(Qt::WindowModal);
其中,
numperations
是完成解析之前需要执行的全部操作。为此,您可能需要对数据进行第一次快速传递,在这里您只需计算要分析的元素总数或类似的内容,并在前面的示例代码中将此值设置为最大值
numperations
。然后进行实际处理并定期调用setValue:

progress.setValue(finishedOperations);
其中finishedOperations是到目前为止解析的内容数

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


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

假设xml解析实现从连接到文件读取器的某种缓冲流中提取数据——读取文件大小,然后每次输入缓冲区从文件读取器中获取另一个块时,更新进度指示器。通过从文件读取器类派生一个新类并重写read block函数来报告进度,这可能是最方便的方法


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

请您解释一下双通道实现好吗?基本上,这意味着您将对整个文档进行一次解析,并累计您知道要处理的节点数,然后在第二个过程中,您实际进行了处理,但现在您知道将有多少个,因此您可以显示仪表。另请参见以下问题: