Russian Qt Forum

Qt => Пользовательский интерфейс (GUI) => Тема начата: poru от Май 24, 2016, 14:12



Название: Как ускорить появление QPrintPreviewDialog?
Отправлено: poru от Май 24, 2016, 14:12
Qt5.6 Win7 У меня время появления диалога ~ 4-5 сек. Порой кажется что на кнопку печати не нажал и нажимаю еще раз, или же что приложение подвисло. С чем связана такая заторможенность? Как ускорить появление?


Название: Re: Как ускорить появление QPrintPreviewDialog?
Отправлено: gil9red от Май 24, 2016, 14:43
Может показывать какой нибудь прогресс-бар, пока окно не появилось?

Ну или, лезть в внутренности и смотреть что вызывается из нативного и замерять время выполнения


Название: Re: Как ускорить появление QPrintPreviewDialog?
Отправлено: Igors от Май 24, 2016, 15:29
Ну или, лезть в внутренности и смотреть что вызывается из нативного и замерять время выполнения
Ну допустим нашли какой-то нативный вызов который тормозит - и что с того?

Может показывать какой нибудь прогресс-бар, пока окно не появилось?
Хорошая мысль, но как потом этот бар закрыть?

Qt5.6 Win7 У меня время появления диалога ~ 4-5 сек. Порой кажется что на кнопку печати не нажал и нажимаю еще раз, или же что приложение подвисло. С чем связана такая заторможенность? Как ускорить появление?
У меня открытие печати из IDE тоже хорошие секунды (хотя и принтера-то нет), видимо шансов "ускорить" немного


Название: Re: Как ускорить появление QPrintPreviewDialog?
Отправлено: gil9red от Май 24, 2016, 15:41
Мое дело предложить варианты :)

Хорошая мысль, но как потом этот бар закрыть?

При сильном желании можно нативными способами узнать об открытии окна, если оно не подконтрольно программе автора.


Название: Re: Как ускорить появление QPrintPreviewDialog?
Отправлено: Racheengel от Май 24, 2016, 17:13
Возможно, эта фигня опрашивает сеть (ищет сетевые принтеры) или что-то в этом роде.
Можно попробовать при старте проги создавать скрытый диалог, а потом при необходимости его показывать.


Название: Re: Как ускорить появление QPrintPreviewDialog?
Отправлено: Igors от Май 25, 2016, 09:17
Возможно, эта фигня опрашивает сеть (ищет сетевые принтеры) или что-то в этом роде.
Можно попробовать при старте проги создавать скрытый диалог, а потом при необходимости его показывать.
Вот когда это "потом"? Ведь главная нитка занята. Можно создать еще нитку и там определить что истекло значительное время - но сделать show нечем (UI только в главной).

Думаю приемлемый вариант такой: сразу выскочить с QProgressDialog и закрыть его по событию. Напр QEvent::FocusIn должно приходить для диалога принтера


Название: Re: Как ускорить появление QPrintPreviewDialog?
Отправлено: poru от Май 25, 2016, 09:29
Выяснилось, как разъясняет https://bugreports.qt.io/browse/QTBUG-44291 (https://bugreports.qt.io/browse/QTBUG-44291), задержка происходит при создании QPinter в src/plugins/printsupport/windows/qwindowsprintdevice.cpp:238:QWindowsPrintDevice::printableMargins() (This is slow, need to cache values or find better way! Modify the DevMode to get the DC printable margins in device pixels) .

Теперь надо показать юзеру, что наша прога не зависла, а лишь слегка задумалась. Идея со скрытым окном не прокатит, за время работы проги, юзер может изменит дефолтный принтер и нам надо по новой его инициализировать. ПрогрессДиалог то же не пойдет, он будет тупо висеть без индикатора.


Название: Re: Как ускорить появление QPrintPreviewDialog?
Отправлено: Igors от Май 25, 2016, 11:18
Выяснилось, как разъясняет https://bugreports.qt.io/browse/QTBUG-44291 (https://bugreports.qt.io/browse/QTBUG-44291), задержка происходит при создании QPinter в src/plugins/printsupport/windows/qwindowsprintdevice.cpp:238:QWindowsPrintDevice::printableMargins() (This is slow, need to cache values or find better way! Modify the DevMode to get the DC printable margins in device pixels) .
Багаж бесполезных знаний успешно пополнен  :)

Идея со скрытым окном не прокатит ..
..
ПрогрессДиалог то же не пойдет, он будет тупо висеть без индикатора.
Вы резво отвергаете вполне разумные советы - но найдется ли у Вас что-то лучшее? Подобные ситуации часто возникают там и сям - главная нитка занята, и обновить UI некому. Какое-то общее/cтандартное решение этой проблемы мне неизвестно. Часто рекомендуют "вынос в поток" - но не уверен возможно ли это для диалога принтера.


Название: Re: Как ускорить появление QPrintPreviewDialog?
Отправлено: poru от Май 25, 2016, 15:58
Подобные ситуации часто возникают там и сям - главная нитка занята, и обновить UI некому. Какое-то общее/cтандартное решение этой проблемы мне неизвестно. Часто рекомендуют "вынос в поток" - но не уверен возможно ли это для диалога принтера.
Вынесем туда принтер, а диалог будет ждать finished.