2013-05-06 103 views
0

我站在一個小的(也許不是)問題面前。我有一個解析XML文件的函數(非常大的xml〜1Gb),所以需要很多時間(5-6分鐘完成func)。我不想在GUI線程中使用它,因爲已知的問題(mainwindow凍結並且什麼都沒有發生,所以用戶認爲一切都出錯了)。我試着用如何在另一個線程中運行一個函數

QtConcurrent::run 

但更多的一個問題來解決這個問題出現了:如果用戶按X鍵(在右上角的關閉按鈕)主GUI線程下降,但其產生的孩子,我的線程QtConcurrent :: run繼續他的工作,我只能通過任務管理器殺死他。

我決定,而不是使用QtConcurrent :: RUN6 QThread的,但我不明白我怎麼可以運行MainWindow類功能:

void MainWindow::parseXML() 

我試圖像這樣創建水木清華:

class pThread : public QThread 
{ 
    Q_OBJECT 
private: 
    void run(); 
}; 

void pThread::run(){ 
    MainWindow::parseXML(); 
} 

但是,當我試圖編譯錯誤顯示:

cannot call member function 'void MainWindow::parseXML()' without object 

而且,我不知道有可能通過此方法更新GUI線程(parseXML函數更改狀態欄)

我該怎麼辦?

+0

請幫忙:(( – tema 2013-05-06 16:48:45

回答

2

在Qt中使用線程的推薦方法不是從QThread類繼承,請參閱文檔here,您應該可以在此之後執行此操作。

是的,它可以從線程更新主窗口,只是代碼信號和插槽的功能,進入mainwindow類代碼一個插槽,更新進度,並進入類的工作(XML解析你需要 - 沒有理由認爲功能應該放入主窗口類)無論如何,您編寫發送進度信號並將其與主窗口插槽連接的信號與Qt::QueuedConnection(請注意,如果對象位於單獨線程中,則默認自動連接將排隊)。

0

另一種選擇是使用啓動QRunnableQThreadPool。你可能想檢查文檔。應該等待QThreadPool :: waitForDone()產生的線程。

相關問題