在Windows(Vista)上使用C++、Qt的GUI设计问题

GUI design issues using C++ , Qt on Windows (Vista)

本文关键字:Qt GUI 问题 C++ Windows Vista      更新时间:2023-10-16

这涉及C++(MinGW)、Qt、Windows Vista:

所有这些都是在我用C++开发非GUI应用程序的时候完成的。最近我决定在Qt中尝试一个GUI,但遇到了一些设计问题。

问题是:

  • 步骤1:使用QMovie加载并显示背景gif动画
  • 步骤2:处理巨大的转储文件(超过2GB)。。。。所以当我预期地到达步骤2时,我的GUI冻结了

我使用while(getline(inputFileStream,stringLine)){…},所以我放置了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;
}

是时候让你长一些球并学习如何使用线程了。GUI冻结是因为它与处理那些大文件的函数在同一个线程中运行。如果将这些任务分开在不同的线程中执行,GUI可以继续可用。

既然你对Qt感兴趣,我建议你阅读QThread:

  • QThreads简介
  • 使用QThread启动线程
  • 如何真正使用QThreads;完整解释

处理步骤需要使用单独的线程。

您可以让处理线程定期检查取消状态变量。如果用户希望取消,请将变量设置为true。然后,处理线程可以正常退出。