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

Posted

技术标签:

【中文标题】在 Windows (Vista) 上使用 C++、Qt 的 GUI 设计问题【英文标题】:GUI design issues using C++ , Qt on Windows (Vista) 【发布时间】:2012-03-14 12:35:17 【问题描述】:

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

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

问题来了:

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

我正在使用 while(getline(inputFileStream,stringLine)) ... 所以我将 QCoreApplication::processEvents(); 放在循环中。 p>

应用程序变得非常缓慢。所以我放置了一个计数器,只有当它达到特定值时才会执行 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;

【问题讨论】:

您的问题是您仍在阻塞 UI 线程(仅在每次迭代后更新 UI 仅在每次迭代非常短的情况下才可行)。请参阅我对相关问题的回答:***.com/questions/8300983/… 您的应用程序是非 gui 的事实是您不应该破坏的巨大优势。因为在使用线程的时候,GUI界面会运行在主线程中,而前一个应用程序中的函数会运行在其他线程中。 【参考方案1】:

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

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

An Introduction to QThreads Starting Threads with QThread How To Really, Truly Use QThreads; The Full Explanation

【讨论】:

【参考方案2】:

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

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

【讨论】:

他也可以使用信号/槽机制来避免显式共享内存

以上是关于在 Windows (Vista) 上使用 C++、Qt 的 GUI 设计问题的主要内容,如果未能解决你的问题,请参考以下文章

C++:在 Vista 上获取网络适配器的 MAC 地址?

如何使用 C++ 在 Windows 上检索分页文件大小的“最小允许”/“推荐”/“当前分配”值?

Windows Vista/7 上的 SDL_Mixer MIDI 音量问题

Windows Vista 下的指针稳定性

如何找出运行 vista/w7 的机器的当前颜色深度?

不同版本的 C++ 库