Проблемы проектирования GUI с использованием C ++, Qt в Windows (Vista) - PullRequest
2 голосов
/ 14 марта 2012

Это касается C ++ (MinGW), Qt, Windows Vista:

- все это, пока я занимаюсь разработкой не-GUI-приложений на C ++.Недавно я решил попробовать графический интерфейс в Qt, и у меня возникли некоторые проблемы с дизайном.

Вот проблема:

  • шаг 1: Загрузка и отображение фона GIF-анимации с использованием QMovie ...
  • шаг2: обрабатывает огромные файлы дампа (более 2 ГБ) .... поэтому, когда я достиг шага 2, мой GUI как-то завис.

я использовал while (getline (inputFileStream,stringLine)) {...} поэтому я поместил QCoreApplication :: processEvents (); внутри цикла.

Приложение стало очень медленным.Поэтому я разместил счетчик, который будет выполняться только в том случае, если он достигнет определенного значения QCoreApplication :: processEvents (); .

Теперь анимация GIF стала больше похожа на серию кадров с видимым переходом от одного к другому.

Любой более быстрый запуск processEvents () замедляет работу приложения (что в любом случае близко к времени выполнения без использования графического интерфейса).

Как я вижу из диспетчера задач 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;
}

Ответы [ 2 ]

5 голосов
/ 14 марта 2012

Пришло время вырастить несколько шариков и научиться использовать нити.Графический интерфейс зависает, потому что он работает в том же потоке, что и функции, работающие с этими большими файлами.Если вы разделяете эти задачи для выполнения в разных потоках, графический интерфейс может продолжать использоваться.

Поскольку вы заинтересованы в Qt, я предлагаю прочитать о QThread :

2 голосов
/ 14 марта 2012

Вам нужно использовать отдельный поток для шага обработки.

Поток обработки может периодически проверять переменную состояния отмены.Если пользователь желает отменить, установите для переменной значение true.Затем поток обработки может завершиться изящно.

...