crossplatform.ru

Здравствуйте, гость ( Вход | Регистрация )

> QTcpServer - вопрос по тормозам
Алексей1153
  опции профиля:
сообщение 24.7.2019, 9:57
Сообщение #1


фрилансер
******

Группа: Участник
Сообщений: 2939
Регистрация: 19.6.2010
Из: Обливион
Пользователь №: 1822

Спасибо сказали: 215 раз(а)




Репутация:   34  


уж не знаю, это глюк версии Qt 5.9.2, либо я что-то не учитываю.
Наткнулся на особенность работы класса QTcpServer. Где-то в тёмных глубинах Qt во время работы программы постепенно накапливаются некие системные сообщения для/от экземпляра данного класса, что при достаточно высокой нагрузке за несколько суток приводит к "накоплению" тормозов при вычитке сообщений в QEventLoop/exec() (кто что предпочитает, но это одно и то же, по сути)

Как работает глюк (по моему предположению): по прошествии длительного времени при очередном вызове m_EventLoop.processEvents(QEventLoop::AllEvents), либо при аналогичном вызове в глубинах exec() совершается некая работа по разгребанию мусорных сообщений (системные сообщения и сигналы). По неким причинам они, эти сообщения, оттуда не вычищаются. Это всё приводит к постепенной нагрузке на ЦП (проверял при помощи отладочных кнопок в приложении - если в этот момент обойти эту функцию, то нагрузка на ЦП пропадает, если обратно начать вызывать - нагрузка появляется).

Почему грешу именно на экземпляр QTcpServer ? Путём долгих и нудных исследований, добавляя отладочные кнопки и галочки выяснил, что именно динамическое пересоздание именно этого компонента программы убирает проблему с повышенной загрузкой ЦП. То есть, я ждал несколько дней, когда ЦП становился загружен на 100%, затем по дебажной кнопке производил пересоздание слушающего объекта
delete pServer;
pServer= new QTcpServer;
pServer->listen...

и тут же всё приходит в норму. Но через пару дней опят нагрузка накапливается. Помогает только динамическое пересознание слушалки, простой вызов close, а даже и закрытие и удаление всех принятых клиентов влияния не оказывает.

Решение на текущий момент: раз в 5 минут пересоздаю слушалку. Тормоза пропали. Это, в принципе, устраивает, так как клиентов, контейнеры - я ничего не затрагиваю, они продолжают работать.

Может, кто знает точно, как это решается штатно, либо это глюк версии Qt 5.9.2 ?

Сообщение отредактировал Алексей1153 - 24.7.2019, 10:00
Перейти в начало страницы
 
Быстрая цитата+Цитировать сообщение

Сообщений в этой теме


Быстрый ответОтветить в данную темуНачать новую тему
Теги
Нет тегов для показа


1 чел. читают эту тему (гостей: 1, скрытых пользователей: 0)
Пользователей: 0




RSS Текстовая версия Сейчас: 20.4.2024, 6:26