Russian Qt Forum

Qt => Многопоточное программирование, процессы => Тема начата: XimXim от Май 17, 2017, 10:51



Название: Увеличение времени работы при минимизации приложения
Отправлено: XimXim от Май 17, 2017, 10:51
Доброго времени суток, уважаемые участники форума!

Столкнулся с непонятной проблемой. А может и не проблемой вовсе. Имеется GUI-приложение. По нажатию на кнопку создаётся отдельный поток, в котором выполняется длительное действие. 

Вот примерный код того, как организуется запуск отдельного потока:
Код:
auto thread = new QThread;
myObj = new MyObject();
myObj->moveToThread(thread);

connect(myObj,SIGNAL(finished()),thread,SLOT(quit()));
connect(thread,SIGNAL(finished()),thread,SLOT(deleteLater()));
connect(thread,SIGNAL(started()),myObj,SLOT(start()));
thread->start();

Ничего необычного, всё стандартно.

А наблюдаю следующую картину: при минимизации (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-х ходили всякие шуточки по этому поводу.