QTcpServer - вопрос по тормозам |
Здравствуйте, гость ( Вход | Регистрация )
QTcpServer - вопрос по тормозам |
Алексей1153 |
24.7.2019, 9:57
Сообщение
#1
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
уж не знаю, это глюк версии Qt 5.9.2, либо я что-то не учитываю.
Наткнулся на особенность работы класса QTcpServer. Где-то в тёмных глубинах Qt во время работы программы постепенно накапливаются некие системные сообщения для/от экземпляра данного класса, что при достаточно высокой нагрузке за несколько суток приводит к "накоплению" тормозов при вычитке сообщений в QEventLoop/exec() (кто что предпочитает, но это одно и то же, по сути) Как работает глюк (по моему предположению): по прошествии длительного времени при очередном вызове m_EventLoop.processEvents(QEventLoop::AllEvents), либо при аналогичном вызове в глубинах exec() совершается некая работа по разгребанию мусорных сообщений (системные сообщения и сигналы). По неким причинам они, эти сообщения, оттуда не вычищаются. Это всё приводит к постепенной нагрузке на ЦП (проверял при помощи отладочных кнопок в приложении - если в этот момент обойти эту функцию, то нагрузка на ЦП пропадает, если обратно начать вызывать - нагрузка появляется). Почему грешу именно на экземпляр QTcpServer ? Путём долгих и нудных исследований, добавляя отладочные кнопки и галочки выяснил, что именно динамическое пересоздание именно этого компонента программы убирает проблему с повышенной загрузкой ЦП. То есть, я ждал несколько дней, когда ЦП становился загружен на 100%, затем по дебажной кнопке производил пересоздание слушающего объекта
и тут же всё приходит в норму. Но через пару дней опят нагрузка накапливается. Помогает только динамическое пересознание слушалки, простой вызов close, а даже и закрытие и удаление всех принятых клиентов влияния не оказывает. Решение на текущий момент: раз в 5 минут пересоздаю слушалку. Тормоза пропали. Это, в принципе, устраивает, так как клиентов, контейнеры - я ничего не затрагиваю, они продолжают работать. Может, кто знает точно, как это решается штатно, либо это глюк версии Qt 5.9.2 ? Сообщение отредактировал Алексей1153 - 24.7.2019, 10:00 |
|
|
ViGOur |
2.8.2019, 13:22
Сообщение
#2
|
Мастер Группа: Модератор Сообщений: 3296 Регистрация: 9.10.2007 Из: Москва Пользователь №: 4 Спасибо сказали: 231 раз(а) Репутация: 40 |
Может ресурсы текут не смотрел в эту сторону?
Из серии соединения создаются, но не удаляются или еще какое выделение... |
|
|
Алексей1153 |
3.8.2019, 7:31
Сообщение
#3
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
ViGOur, не, там всё чётко, перепроверил, отслеживал всё. Дело именно в слушалке - ну так ведь слушалка к соединениям отношения вообще не имеет, если это только не баг Qt с накоплением каких-то извещений, которые в exec/QEventLoop::processEvents не вычищаются. Пересоздаю слушающий сокет (соединения и данные не затрагиваю) - и вуаля, очередь сообщений больше не тормозит
Сообщение отредактировал Алексей1153 - 3.8.2019, 7:32 |
|
|
Алексей1153 |
16.8.2019, 8:01
Сообщение
#4
|
фрилансер Группа: Участник Сообщений: 2941 Регистрация: 19.6.2010 Из: Обливион Пользователь №: 1822 Спасибо сказали: 215 раз(а) Репутация: 34 |
до сих пор полёт нормальный. Так что, собака зарыта именно в этом моменте. Но как это лечить "официально" - я не знаю. Сейчас только так - через костыль delete/new
|
|
|
Текстовая версия | Сейчас: 25.11.2024, 18:59 |