简体   繁体   中英

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

This concerns C++ (MinGW), Qt, Windows Vista:

all this while i's developing non-GUI applications in C++. Recently i decided to try a GUI one in Qt and am having some design issues.

Here's the problem:

  • step 1: Load and display a background gif Animation using QMovie...
  • step 2: process huge dump files (over 2GB's)....so when i reached step 2 expectedly my GUI froze..

i was using while(getline(inputFileStream,stringLine)) {...} so i placed QCoreApplication::processEvents(); inside the loop.

The application became really slow. So i placed a counter which only if it reaches a particular value will QCoreApplication::processEvents(); be executed.

Now the gif animation has become more like series of frames with visible transition from one to another.

Any faster triggering of processEvents() slows the application down (which anyway is nowhere near the non-GUI execution time).

As i see from Windows Task Manager one core has high utilization while other has low during the execution period.

So what approach should i take? Should i delve into mutithreading (i'v never used it before)?

Stripping down everything to explain the question the program looks like this:

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;
}

It's time for you to grow some balls and learn how to use threads. The GUI freezes because it runs within the same thread as the functions that deal with those large files. If you separate these tasks to be executed in different threads, the GUI can continue to be useable.

Since you have an interested in Qt, I suggest reading about QThread :

You need to use a separate thread for the processing step.

You can have the processing thread periodically check a cancellation status variable. Should the user wish to cancel, set the variable to true. The processing thread can then exit gracefully.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM