Название: Увеличение времени работы при минимизации приложения Отправлено: XimXim от Май 17, 2017, 10:51 Доброго времени суток, уважаемые участники форума!
Столкнулся с непонятной проблемой. А может и не проблемой вовсе. Имеется GUI-приложение. По нажатию на кнопку создаётся отдельный поток, в котором выполняется длительное действие. Вот примерный код того, как организуется запуск отдельного потока: Код: auto thread = new QThread; Ничего необычного, всё стандартно. А наблюдаю следующую картину: при минимизации (Minimize) приложения время работы операции в созданном потоке увеличивается, если приложение не "сворачивать", то приложение работает быстрее. Не могу понять в чём дело. Возможно это связано с приоритетами потоков в системе и при "сворачивании" приложения приоритет потока понижается и ему отдаётся меньшее кол-во процессорного времени. Тогда почему другие программы в "свёрнутом" состоянии работают также быстро? Запускал какой-то инсталлятор и время его работы всегда было одинаковым. Кто-нибудь может подсказать в чем причина? Название: Re: Увеличение времени работы при минимизации приложения Отправлено: Пантер от Май 17, 2017, 10:53 Чем занимается MyObject? Идет ли какая-то коммуникация с ГУИ из этого потока?
Название: Re: Увеличение времени работы при минимизации приложения Отправлено: XimXim от Май 17, 2017, 11:45 Цитировать Чем занимается MyObject? MyObject декодирует большое кол-во файлов.Цитировать Идет ли какая-то коммуникация с ГУИ из этого потока? Через сигнал MyObject сообщает статус операции.Код: connect(myObj,SIGNAL(operationStatus(QString)), ui->StatusLabel, SLOT(setText(QString))); Название: Re: Увеличение времени работы при минимизации приложения Отправлено: Пантер от Май 17, 2017, 11:57 А не пробовал ли убрать этот коннект?
Название: Re: Увеличение времени работы при минимизации приложения Отправлено: XimXim от Май 17, 2017, 11:59 Попробовал. Ситуация не изменилась.
Название: Re: Увеличение времени работы при минимизации приложения Отправлено: Пантер от Май 17, 2017, 12:46 А на сколько отличается время работы?
Название: Re: Увеличение времени работы при минимизации приложения Отправлено: XimXim от Май 17, 2017, 12:53 В два раза
Название: Re: Увеличение времени работы при минимизации приложения Отправлено: Пантер от Май 17, 2017, 13:22 Нехило. Кстати, под какой ОС это происходит? Не пробовал мониторить процесс на предмет загрузки процессора и памяти в обоих случаях?
Название: Re: Увеличение времени работы при минимизации приложения Отправлено: XimXim от Май 18, 2017, 08:29 Загруженность процессора смотрел в processExplorer.
Как только "сворачивал" приложение, CPU Usage уменьшался с 2-3% до 0.3%. Когда восстанавливал, то использование процессора возвращалось на уровень 2-3%. Запускаю всё это под Windows 7 x86. А вот под другой осью проверить не догадался почему-то. Надо попробовать. Название: Re: Увеличение времени работы при минимизации приложения Отправлено: Пантер от Май 18, 2017, 09:23 Попробуй еще http://doc.qt.io/qt-5/qthread.html#setPriority - поднять приоритет нити. Возможно, при сворачивании Кьют понижает приоритет. Кстати, помню такую плюху - Кьют освобождал память при сворачивании окна под Виндой. Как сейчас не знаю.
Название: Re: Увеличение времени работы при минимизации приложения Отправлено: XimXim от Май 18, 2017, 09:32 Первым делом вчера попробовал такую штуку. Так как было подозрение, что приоритет понижается.
Но увы. Устанавливал HighestPriority, затем запускал поток и в нём проверял его приоритет через QThread::currentThread()->priority(). Приоритет был такой какой я и выставил - HighestPriority, но работал медленно. Название: Re: Увеличение времени работы при минимизации приложения Отправлено: XimXim от Май 18, 2017, 09:38 А ещё пробовал на других машинах/ОС запускать. Доступны были к сожалению только компьютеры с Win7, но разной разрядности.
На Win7 Professional x64 - работает нормально, Win7 Professional x86 - тоже всё замечательно. Название: Re: Увеличение времени работы при минимизации приложения Отправлено: Пантер от Май 18, 2017, 10:00 К сожалению, я не знаю, что это может быть. :( Может, кто еще чем поможет. (я уже много лет под виндой не работаю и не деплоюсь).
Название: Re: Увеличение времени работы при минимизации приложения Отправлено: XimXim от Май 18, 2017, 10:03 Всё равно большое спасибо за помощь.
Название: Re: Увеличение времени работы при минимизации приложения Отправлено: Igors от Май 18, 2017, 11:09 Как только "сворачивал" приложение, CPU Usage уменьшался с 2-3% до 0.3%. Когда восстанавливал, то использование процессора возвращалось на уровень 2-3%. Если разбираться, то сначала выяснить почему вообще такое низкое потребление 2-3% ? Чем запущенная нитка тогда занимается остальные 97% времени ?Название: Re: Увеличение времени работы при минимизации приложения Отправлено: XimXim от Май 18, 2017, 13:56 А кто даст нитке 100% процессорного времени? Всё-таки в системе и другие процессы имеются. Мне казалось, что Process Explorer показывает процент от общего использования.
Интересно как раз почему CPU usage падает в несколько раз при сворачивании приложения. Поток как-то выполняться по-другому стал? На мой взгляд, в нём выполняются всё те же операции. Название: Re: Увеличение времени работы при минимизации приложения Отправлено: kuzulis от Май 18, 2017, 14:16 А "запилить" простенький компилябельный пример/тест, который воспроизводит проблему, можно?
Название: Re: Увеличение времени работы при минимизации приложения Отправлено: Igors от Май 18, 2017, 14:16 А кто даст нитке 100% процессорного времени? Всё-таки в системе и другие процессы имеются. Мне казалось, что Process Explorer показывает процент от общего использования. Не любитель Вындоуз, как там не знаю. В моем ОС 100% соответствует одному ядру. Напр процесс потребляет 360% - значит использует почти все из 4 ядер. Др процессы конечно есть, но в нормальном состоянии потребляют очень немного - до 10% далекоНазвание: Re: Увеличение времени работы при минимизации приложения Отправлено: XimXim от Май 19, 2017, 08:38 Проблема оказалась в использовании QThread::usleep внутри потока.
Я приостанавливал второй поток для того, чтобы дать возможность главному отрисовать форму и обновить прогресс операции. Видимо это была не самая лучшая идея, хотя всё работало хорошо в не свёрнутом приложении. Это же и объясняет малое потребление процесорного времени. В документации QT сказано: Цитировать Instead of the sleep() functions, consider using QTimer. Буду использовать его. Осталось понять, что же происходит при использовании QThread::usleep. Название: Re: Увеличение времени работы при минимизации приложения Отправлено: Пантер от Май 19, 2017, 08:54 Эм. Зачем вообще sleep? Главный поток не зависит от твоего, главное только, чтобы ты ему отдавал данные исключетельно через сигналы.
Название: Re: Увеличение времени работы при минимизации приложения Отправлено: XimXim от Май 19, 2017, 09:00 Слишком часто слал сигнал. При перетаскивании формы наблюдались лаги. Ничего умнее sleep не придумал :)
Название: Re: Увеличение времени работы при минимизации приложения Отправлено: Пантер от Май 19, 2017, 09:43 Шли реже. :)
Название: Re: Увеличение времени работы при минимизации приложения Отправлено: __Heaven__ от Май 19, 2017, 21:46 Есть такая вещь, по крайней мере под виндой, больший приоритет отдаётся активному приложению. Видел пример работы одной программы с выполнением визуальной функции. Было запущено 2 экземпляра. Тот, что был в фокусе получал больше квантов, как только фокус менялся - менялся и приоритет. К сожалению, как связано это с теми приоритетами, что выставляются в менеджере процессов я не знаю.
Название: Re: Увеличение времени работы при минимизации приложения Отправлено: Alex Custov от Июнь 02, 2017, 15:01 Кстати, помню такую плюху - Кьют освобождал память при сворачивании окна под Виндой. Как сейчас не знаю. так это вроде давнишняя фишка винды, что при сворачивании освобождается память. Ещё в начале 2000-х ходили всякие шуточки по этому поводу. |