Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: frostyland от Март 09, 2011, 12:32



Название: Что за жуткие тормоза при создании QFileDialog?
Отправлено: frostyland от Март 09, 2011, 12:32
Здравствуйте.

Создание QFileDialog приводит к "замерзанию" интерфейса более чем на 5-7 секунд!
Обратите внимание - просто создание, без открытия - динамическое [QFileDialog *fd = new QFileDialog(m_scheme)]
или на стеке - без разницы.
При этом вызов статической функции QFileDialog::getOpenFileName - летает просто.

Что за ерунда - кто-нибудь пояснит?


Название: Re: Что за жуткие тормоза при создании QFileDialog?
Отправлено: Пантер от Март 09, 2011, 12:40
QFileDialog::getOpenFileName по умолчанию вызывает нативный вариант, возможно, дело в этом.


Название: Re: Что за жуткие тормоза при создании QFileDialog?
Отправлено: frostyland от Март 09, 2011, 14:20
ну да... я посмотрел в коде.
но 5-7 секунд на не самой медленной машинке - это же уму непостижимо!
а ведь хочется использовать и сигналы и все вкусности объекта, а не просто статические методы...


Название: Re: Что за жуткие тормоза при создании QFileDialog?
Отправлено: SASA от Март 09, 2011, 14:55
Это факт, что Qt диалоги работают медленнее.


Название: Re: Что за жуткие тормоза при создании QFileDialog?
Отправлено: frostyland от Март 09, 2011, 15:06
увы.... не просто медленнее. пипец, как медленно )))))
я глянул - они в своем же коде практически из не используют, все обходятся статическими вызовами.



Название: Re: Что за жуткие тормоза при создании QFileDialog?
Отправлено: Пантер от Март 09, 2011, 15:15
Попробуй поковыряться в коде QFileDialog и понять откуда ноги растут.


Название: Re: Что за жуткие тормоза при создании QFileDialog?
Отправлено: frostyland от Март 09, 2011, 15:36
по коду вроде как неоткуда. трейсинг вечело проходит все методы конструктора, вот только после этого весь интерфейс рпограммы умирает на несколько секунд
Визуально это выглядит так.
Код
C++ (Qt)
 
QFileDialog fd;
QMessageBox::information(0, "", "");
 
QMessageBox отображает свои контуры, но и только. последующая отрисовка и реакция на мышь и клаву замерзает на вечность.



PS.
Вот еще наблюдение. ПРоблема не в создании диалога как такового.
Создание с последующим мгновенным убитием не вызывает тормозов
Код
C++ (Qt)
 
{
QFileDialog fd;
}
QMessageBox::information(0, "", "");
 
Значит, скорее всего, диалог где-то цепляет на себя очередь оконных сообщений, даже не отобржаясь на экране, и не отдает ни в какую...



PPS.

Хмм... А вот если сделать так
Код
C++ (Qt)
QFileDialog fd;
QFileDialog fd::getOpenFileName(...)
 
то окно тоже шустренько выводится на экран, и прорисовывается все как надо, только вот нету никакой реакции на мышку - мышь двигается но не может ничего выделить в окошке диалога.

... Чистио теоретически, объект передает управление дальше, однако где-то полностью захватывает очередь оконных сообщений, что-то делает и потом отпускает ее.
Это жутко как неудобно искать ((((
Отложим до лучших времен )


Название: Re: Что за жуткие тормоза при создании QFileDialog?
Отправлено: ufna от Март 09, 2011, 16:34
насколько помню, это так всегда было ) там по-моему файловая модель тормозит.


Название: Re: Что за жуткие тормоза при создании QFileDialog?
Отправлено: Disaron от Март 09, 2011, 22:05
У меня оно зачем-то к флопповоду обращается, и пока не получит отклик что там ничего нету - диалог не показывает.


Название: Re: Что за жуткие тормоза при создании QFileDialog?
Отправлено: Пантер от Март 09, 2011, 22:08
Это нормально - модель делает запрос на получение иконки флоповода, который сначала проверяет наличие вставленного диска. Винда, однако.


Название: Re: Что за жуткие тормоза при создании QFileDialog?
Отправлено: frostyland от Март 10, 2011, 07:28
не-не, ребята, явно ни файловая модель, ни иконка флопа тут ни при чем.
по модели: тогда бы зависание было внутри конструктора, при построении ее, а конструктор пролетает на ура, тормозит только последующее построение любого окна, даже простого QMessageBox.
по флопарю: не жужжит флопарь, нету к нему обращения.


Название: Re: Что за жуткие тормоза при создании QFileDialog?
Отправлено: Пантер от Март 10, 2011, 08:17
Как раз не в конструкторе, а при заполнение модели, которое происходит в потоке.


Название: Re: Что за жуткие тормоза при создании QFileDialog?
Отправлено: GreatSnake от Март 10, 2011, 08:37
Цитировать
тормозит только последующее построение любого окна, даже простого QMessageBox.
Модель заполняется по таймеру, который отрабатывет в первом обработчике событий, который и запускается в QMessageBox::information().


Название: Re: Что за жуткие тормоза при создании QFileDialog?
Отправлено: frostyland от Март 10, 2011, 08:40
Как раз не в конструкторе, а при заполнение модели, которое происходит в потоке.

Как раз не в конструкторе, а при заполнение модели, которое происходит в потоке.
Дак тем более, это же поток отдельный, да еще без вывода на экран, откуда тормоза???
Тормоза именно при выводе на экран любого типа окна, как я писал выше.
ПРичем, забавно:
  • при выводе своего окна диалога отрисовывается сразу все, в том числе и файловая модель (2 каталога )))), но мышка тупит и не выделяет итемы
  • при выводе QMessageBox трисовывается только рамка окна и все замерзает
Не, ерунда какая-то, дело явно не в модели как таковой. Где-то лажа в реализации...
Вот кстати, смешной примерчик:
Код
C++ (Qt)
QFileDialog fd;
qDebug("1");
qDebug("2");
qDebug("3");
qDebug("4");
m_scheme->m_scene->addEllipse(10, 10, 40, 50);
 
После конструирования диалога сразу отрисовываю итем на сцене - снова без тормозов.
Явно что-то типа эксклюзивного захвата очереди оконных сообщений, ИМХО.


Название: Re: Что за жуткие тормоза при создании QFileDialog?
Отправлено: frostyland от Март 10, 2011, 08:43
Цитировать
тормозит только последующее построение любого окна, даже простого QMessageBox.
Модель заполняется по таймеру, который отрабатывет в первом обработчике событий, который и запускается в QMessageBox::information().

Что-что :o ?? А причем тут обработчик совершенно другого окна? Которому до звезды чужая файловая модель??
Это как так?
Кроме того - в модели, на моем уровне: всего 2 каталога. или заполняется вся модель вселенной моего компьютера?


Название: Re: Что за жуткие тормоза при создании QFileDialog?
Отправлено: GreatSnake от Март 10, 2011, 08:57
Цитировать
А причем тут обработчик совершенно другого окна? Которому до звезды чужая файловая модель??
Вот как раз, что ему "до звезды" он и обрабатывает очередь событий.


Название: Re: Что за жуткие тормоза при создании QFileDialog?
Отправлено: frostyland от Март 10, 2011, 09:13
Цитировать
А причем тут обработчик совершенно другого окна? Которому до звезды чужая файловая модель??
Вот как раз, что ему "до звезды" он и обрабатывает очередь событий.

все-таки не ясно мне. в таком случае все последующие окна должны замерзать.
Однако я провел эксперимент:
после QFileDialog fd; резко метнулся на кнопку "ОТкрыть" и вызвал диалог выбора файлов. Все чики-пуки, быстро и адекватно.

------------
Резюмяшка
Интернет как русскоязычный так и англоязычный полон сетованиями по этому поводу, судя по всему - это та самая проруха, на в-общем-то неплохую Qt-"старуху" ))).  Этот кусок кода явно доверили не тому человеку ).


Название: Re: Что за жуткие тормоза при создании QFileDialog?
Отправлено: Авварон от Март 10, 2011, 12:13
Вы когда опен делаете не делайте его от мукомпутора и все будет работать
В винапи реально есть косяк с получением инфо от флоппи дисков (даже если их в системе нет(!!!)), который не лечится _вообще_ никак (ф-ия GetVolumeInformaion и иже с ней возвращают эррор код NotReady с бешеной задержкой). Я на это много времени потратил, решения не нашел. Баг есть в c# также если пощупать класс VolumeInfo (DriveInfo?). Единственный воркэраунд - вырезать диски A: и B: и не обращаться к ним. Но файлмодели кьюта это не умеют.


Название: Re: Что за жуткие тормоза при создании QFileDialog?
Отправлено: frostyland от Март 10, 2011, 12:21
Вы когда опен делаете не делайте его от мукомпутора и все будет работать
В винапи реально есть косяк с получением инфо от флоппи дисков (даже если их в системе нет(!!!)), который не лечится _вообще_ никак (ф-ия GetVolumeInformaion и иже с ней возвращают эррор код NotReady с бешеной задержкой). Я на это много времени потратил, решения не нашел. Баг есть в c# также если пощупать класс VolumeInfo (DriveInfo?). Единственный воркэраунд - вырезать диски A: и B: и не обращаться к ним. Но файлмодели кьюта это не умеют.

У меня даже до опена не доходит )) Я, если Вы заметили по моим постам, даже до этого не дохожу.
Тем не менее, попробовал вот так
Код
C++ (Qt)
QFileDialog fd;
QDir dir2;
dir2.setPath("d:/tmp");
fd.setDirectory(dir2);
QMessageBox::information(m_scheme, "", "");
 
Все равно QMessageBox умирает на 5 секунд.

 


Название: Re: Что за жуткие тормоза при создании QFileDialog?
Отправлено: Авварон от Март 10, 2011, 12:24
воткните дебаги а еще лучше профилировку QTime'ом на каждую строку.
и передавайте директорию в конструктор диалога


Название: Re: Что за жуткие тормоза при создании QFileDialog?
Отправлено: frostyland от Март 10, 2011, 12:34
воткните дебаги а еще лучше профилировку QTime'ом на каждую строку.
и передавайте директорию в конструктор диалога

Директория в конструкторе не приводит ни к чему.
QTime - непонятно куда его втыкать - главный поток то проходит нормально, тормоза при выводе левого окошка,
а главное - для этого надо корежить исходники Qt - и перекомпилировать.
У меня почему-то библиотека не перекомпилируется - вылезают ошибки всякие - часу на втором компиляции.
Мрачно все это [БУУУУУЭЭЭЭЭЭЭЭЭЭ].
А дебаг не отлавливает, пока я прохожу по строкам, проходит больше 5 секунд и все красиво выстраивается.

Ладно, забил я на это. Сами Qt-шники положили на свой кривой класс как в коде, так и в семплах.  ;D



Название: Re: Что за жуткие тормоза при создании QFileDialog?
Отправлено: silart от Апрель 19, 2012, 08:11
Что интересно, если в "Моем компьютере" нет флоповода, то все работает хорошо, без тормозов. А если он есть, то начинаются жуткие тормоза секунд на 7 при создании диалога.

Кому-нибудь удалось побороть эти глюки или как-то их обойти?

Чем мне не нравятся нативные виндовые диалоги, так это тем, что они создаются почему-то не в середине окна, а где-то сбоку. Может как-то можно заставить их создаваться посередине?


Название: Re: Что за жуткие тормоза при создании QFileDialog?
Отправлено: GreatSnake от Апрель 19, 2012, 10:08
Может как-то можно заставить их создаваться посередине?
Средствами Qt не получится.