Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: merke от Август 07, 2010, 15:28



Название: [Решено]Чтобы не застывал интерфейс
Отправлено: merke от Август 07, 2010, 15:28
Всем привет!

Подскажите функцию в кутях, которая не позволяет зависать главному потоку т.е. GUI во время выполнения долгих вычислений. А то приложение замирает всё на секунд 10 во время выполнения тяжелых вычислений.

Буду рад помощи!

С уважением, Александр


Название: Re: Чтобы не застывал интерфейс
Отправлено: f0x от Август 07, 2010, 16:15
читай про многопоточность в книжках или Qt assistant


Название: Re: Чтобы не застывал интерфейс
Отправлено: merke от Август 07, 2010, 16:26
многопоточность тут ни при чем. Я знал эту функцию, но она вылетила напрочь из головы!


Название: Re: Чтобы не застывал интерфейс
Отправлено: AleUri от Август 07, 2010, 16:35
qApp->processEvents();


Название: Re: Чтобы не застывал интерфейс
Отправлено: kowsan от Август 07, 2010, 16:35
QCoreApplication::processEvents


Название: Re: Чтобы не застывал интерфейс
Отправлено: merke от Август 07, 2010, 16:45
Супер. Спасибо! то что нужно!!!


Название: Re: [Решено]Чтобы не застывал интерфейс
Отправлено: Etud от Август 07, 2010, 18:54
и что ?!!

эта функция спасает от массы операций GUI ?


Название: Re: [Решено]Чтобы не застывал интерфейс
Отправлено: f0x от Август 07, 2010, 19:46
нет. использовать этот метод для обработки длительных вычислений - далеко не лучший способ


Название: Re: [Решено]Чтобы не застывал интерфейс
Отправлено: Igors от Август 07, 2010, 19:49
нет. использовать этот метод для обработки длительных вычислений - далеко не лучший способ
Ну тогда уж интересно узнать какой же лучший  :)


Название: Re: [Решено]Чтобы не застывал интерфейс
Отправлено: zenden от Август 07, 2010, 22:29
Отдельный поток, естессно!

А как иначе, если разбить задачу на маленькие кусочки невозможно?
А вы уверены, что участок кода, выполняющийся при одних условиях 0.01 с, не будет выполняться при других условиях 10 с?


Название: Re: [Решено]Чтобы не застывал интерфейс
Отправлено: Igors от Август 08, 2010, 10:05
Отдельный поток, естессно!
Чем же оно так естественно? Только тем что такая рекомендация есть в букваре?  :)
А если посмотреть непредвзято: нужно как-то обновлять индикатор в главной нитке, уметь остановить нитку, поймать завершение и.т.д. И потом: если UI "разрешено" - в нем придется предусмотреть все ситуации когда запущенная нитка потеряла всякий смысл. Поэтому во многих случаях (если не в большинстве) проще и лучше действовать через модальный QProgressDialog (который позовет тот же processEvents)


Название: Re: [Решено]Чтобы не застывал интерфейс
Отправлено: xokc от Август 08, 2010, 22:31
придется предусмотреть все ситуации когда запущенная нитка потеряла всякий смысл. Поэтому во многих случаях (если не в большинстве) проще и лучше действовать через модальный QProgressDialog (который позовет тот же processEvents)
Проще - да. Но лучше ли?


Название: Re: [Решено]Чтобы не застывал интерфейс
Отправлено: ufna от Август 09, 2010, 11:06
смотря какая задача. Очень часто - лучше. На то эти диалоги и придуманы, как мне кажется.

к примеру, "open fsaved file" в проге - в зависимости от специфики - может занять разное время, и в основной поток грузится много данных. Зачем второй и т.п., если во время открытия пользователю кликать совершенно ничего не надо?


Название: Re: [Решено]Чтобы не застывал интерфейс
Отправлено: xokc от Август 09, 2010, 21:46
Зачем второй и т.п., если во время открытия пользователю кликать совершенно ничего не надо?
Хотя-бы для того, чтобы иметь возможность передвинуть основное окно приложения пока идет обработка. С моей точки зрения использование модальных диалогов для вывода информации - вообще зло. Но это уже совсем другая история.