2012-03-14 65 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