2012-03-14 113 views
2

這涉及到C++(MinGW的),Qt的,Windows Vista中:GUI設計問題

這一切,而我的開發非GUI的C++應用程序。最近我決定嘗試在Qt中使用GUI,並且遇到一些設計問題。

這裏的問題:

  • 第1步:加載和顯示用QMovie背景GIF動畫...
  • 第2步:過程中巨大的轉儲文件(超過2GB的)... 。所以,當我到達步驟2果然我的GUI愣..

我使用而(函數getline(inputFileStream,標線)){...}所以我放置QCoreApplication :: processEvents();在循環內。

應用程序變得非常慢。所以我放置了一個計數器,只有當它達到一個特定的值時纔會執行QCoreApplication :: processEvents();執行

現在gif動畫已經變得更像是一系列可見的過渡幀。

任何更快的觸發processEvents()減慢應用程序(無論如何,這遠遠不是非GUI執行時間附近)。

正如我從Windows任務管理器中看到的,一個內核具有較高的利用率,而另一個內核在執行期間很低。

那麼我應該採取什麼方法?我應該深入研究多線程(我以前從未使用過)?

剝離下來的一切來解釋問題的程序是這樣的:

class Animation; 
class FileProcessing; 

main(int argc,char** argv) { 
     QApplication* app=new QApplication(argc,argv); 
     QLabel* label1=new QLabel(...); 
     QLabel* label2=new QLabel(...); 
     Animation* objAnim=new Animation(...); //QMovie plays gif 
     objAnim->show(); 

     //fileDialogs --> ask for files..this is modal so animation is fine till this point 

     FileProcessing* objFileProcessing=new FileProcessing(...); 

     objFileProcessing->processFiles(label1,label2); //process >2GB files 
     //in this i repeatedly call processEvents() as written above 

     //delete labels,objAnim and objFileProcessing; 
     delete app; 
     return 0; 
} 
+0

你的問題是,你仍然阻塞UI線程(只是在每次迭代很短時才更新UI)。看到我的答案相關的問題:http://stackoverflow.com/questions/8300983/qt-programming-and-computations-which-take-long-time/8301442#8301442 – 2012-03-14 12:41:40

+0

事實上,你的應用程序是非gui是一個巨大的優勢,你不應該毀了。因爲在使用線程時,Gui接口將在主接口中運行,而前一個應用中的功能將在其他線程中運行。 – UmNyobe 2012-03-14 12:46:23

回答

2

你需要使用一個單獨的線程的處理步驟。

您可以讓處理線程定期檢查取消狀態變量。如果用戶希望取消,請將該變量設置爲true。處理線程然後可以優雅地退出。

+0

他也可以使用信號/插槽機制來避免顯式共享內存 – arne 2012-03-14 12:42:23

5

現在是時候讓你種植一些球並學習如何使用線程。 GUI凍結是因爲它在與處理這些大文件的函數相同的線程中運行。如果將這些任務分開以在不同線程中執行,則GUI可以繼續使用。

既然你有興趣的Qt,我建議閱讀有關QThread

+3

長出一些球.... + infinity – UmNyobe 2012-03-14 12:42:55