Russian Qt Forum

Qt => Общие вопросы => Тема начата: Гурман от Апрель 07, 2014, 15:24



Название: Много нитей передающих - глюки интерфейса
Отправлено: Гурман от Апрель 07, 2014, 15:24
Любопытная проблема, пока не ясно, в чем именно дело. Windows, приложение еще на Qt4.7ю

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

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

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

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

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


Название: Re: Много нитей передающих - глюки интерфейса
Отправлено: Bepec от Апрель 07, 2014, 15:35
Очень похожий затык был и у меня. Там дело было в накоплении сигналов. Т.е. перерисовка шла после сигнала. При альт-табе и перетаскивании окна события накапливались, после возобновления события продолжали приходить => постоянная перерисовка без конца. Приложение работает, идёт постоянная перерисовка, приложение для пользователя зависло.

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


Название: Re: Много нитей передающих - глюки интерфейса
Отправлено: Гурман от Апрель 08, 2014, 09:40
А. То есть, при перетаскивании окно перестает перерисовываться, перестает обрабатывать соответствующие сигналы, и они оверфлудят. Похоже на то. У меня есть только одно окно, в котором есть графике, перерисовываемая при получении сигналов - надо будет попробовать действительно его по таймеру перерисовывать.