Russian Qt Forum
Ноябрь 23, 2024, 21:11 *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

Войти
 
  Начало   Форум  WIKI (Вики)FAQ Помощь Поиск Войти Регистрация  

Страниц: [1]   Вниз
  Печать  
Автор Тема: Много нитей передающих - глюки интерфейса  (Прочитано 1956 раз)
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« : Апрель 07, 2014, 15:24 »

Любопытная проблема, пока не ясно, в чем именно дело. Windows, приложение еще на Qt4.7ю

В приложении грузятся несколько плагинов, каждый открывает свое окно. По некой кнопке в нескольких плагинах запускаются несколько нитей, которые посылают простые данные (не больше вещественного двойной точности) сигналами. Другие нити эти сигналы принимают, производят обработку, потом продолжают делать что делали. При этом довольно много чего выводится в окна, в частности, рисуется сцена, в "консоль" выводится текст, в одном окне рисуется графика стандартными примитивами.

Вот когда всё это происходит, некоторое время приложение ведет себя нормально. Но в какой-то момент времени перестает адекватно работать оконный интерфейс. Как будто сигналы перестают поступать в окна, нет реакции на cursor over, нет реакции на нажатия на кнопки. Реакция появляется, если переключить приложения Alt-Tab-ом, но буквально на несколько последних действий, после чего опять перестает реагировать на пользователя. Окна перерисовываются, их можно переключать, но нельзя перетаскивать. Стоит остановить всё, все нити при этом останавливаются сразу - всё начинает нормально отзываться и работает, как ни в чем ни бывало.

Посмотрел занятость ядер процессора - вообще очень странно. Ядер 4, заняты при работе этого приложения все, но... только на 25-30% каждое. То есть, процессорного ресурса еще вагон, Windows нормально живет себе при этом.

Вот что это за затык такой? Что происходит не так, когда несколько нитей (в данном случае 4) параллельно шлют и принимают сигнал-слоты? Причем еще существенно - видно, что приложение ощутимо тормозит, по выводу в консоль. Строки появляются с большой задержкой, хотя там нить даже ничего не принимает и не ждет, просто плюется сигналом периодически, между выдачами в консоль.

Может это быть из-за того, что всему приложению дадено осью мало процессорного времени, и когда оно поделилось между нитями и обработчиками сигнал-слотов, то у последних оказалось совсем мало процессорного времени, и очереди переполняются? Кто-нибудь сталкивался с похожими эффектами? Надо разобраться, где тормоза, поскольку в приложении должны работать много нитей, и они должны обмениваться через сигнал-слоты, в том числе, выдавать сигналы в главную нить, чтобы там рисовались всякости в графике.
Записан

2^7-1 == 127, задумайтесь...
Bepec
Гость
« Ответ #1 : Апрель 07, 2014, 15:35 »

Очень похожий затык был и у меня. Там дело было в накоплении сигналов. Т.е. перерисовка шла после сигнала. При альт-табе и перетаскивании окна события накапливались, после возобновления события продолжали приходить => постоянная перерисовка без конца. Приложение работает, идёт постоянная перерисовка, приложение для пользователя зависло.

Что помогло - сделал фиксированную перерисовку вне зависимости от количества приходящих данных. В сигнале приходят данные, накапливаются и раз в 25 мс перерисовывается что надо.
Записан
Гурман
Гуру общения
******
Offline Offline

Сообщений: 1442

Qt 2.2, 3.3, 4.5, 4,7, 4.8, 5.3, 5.6, 5.9, 5.12


Просмотр профиля
« Ответ #2 : Апрель 08, 2014, 09:40 »

А. То есть, при перетаскивании окно перестает перерисовываться, перестает обрабатывать соответствующие сигналы, и они оверфлудят. Похоже на то. У меня есть только одно окно, в котором есть графике, перерисовываемая при получении сигналов - надо будет попробовать действительно его по таймеру перерисовывать.
Записан

2^7-1 == 127, задумайтесь...
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


Страница сгенерирована за 0.07 секунд. Запросов: 22.