2012-03-14 2 views
2

Это относится к C++ (MinGW), Qt, Windows Vista:вопросы проектирования GUI с использованием C++, Qt на Windows (Vista)

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

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

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

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

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

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

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

Как я вижу из диспетчера задач Windows, одно ядро ​​имеет высокий уровень использования, а другой - низкий во время выполнения.

Итак, какой подход я должен принять? Должен ли я вникать в mutithreading (я никогда не использовал его раньше)?

Зачистка вниз все, чтобы объяснить этот вопрос программа выглядит следующим образом:

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

Ваша проблема заключается в том, что вы по-прежнему блокирует поток пользовательского интерфейса (просто обновляя пользовательский интерфейс после каждой итерации, возможно только в том случае, если каждая итерация очень короткая). См. Мой ответ на соответствующий вопрос: http://stackoverflow.com/questions/8300983/qt-programming-and-computations-which-take-long-time/8301442#8301442 –

+0

Тот факт, что ваше приложение было не-gui огромное преимущество, которое вы не должны разрушать. Потому что при использовании потоков интерфейс Gui будет работать в основном, а функции в предыдущем приложении будут работать в других потоках. – UmNyobe

ответ

2

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

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

+0

Он также мог использовать механизм сигнала/слота, чтобы избежать явной общей памяти. – arne

5

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

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

+3

вырастите несколько шаров .... + бесконечность – UmNyobe

Смежные вопросы