2010-09-07 47 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還是其他格式。