Russian Qt Forum

Qt => Вопросы новичков => Тема начата: kkmple от Август 21, 2021, 00:02



Название: Подвисает GUI при удерживании мышкой окна
Отправлено: kkmple от Август 21, 2021, 00:02
Доброго времени суток. Используя readyRead и ReadAll() забираю все с com порта. Далее прохожусь парсером и вывожу на виджеты, всего порядка 30 постоянно меняющихся значений. Если я захватываю окно мышкой, мои данные перестают отображаться. В qDebug() я вижу что после отпускания мышкой, буфер куда я делаю readALL() разрастается до 12000(80 при нормальной работе) и я ловлю битый пакет.
После чего вычитывая парсером буфер уменьшается.
Как избежать подвисаний? Начинать читать про потоки? Но на форуме добрая половина тем о том что не нужно использовать потоки вместе qSerialPort.  :o ???


Название: Re: Подвисает GUI при удерживании мышкой окна
Отправлено: Old от Август 21, 2021, 03:56
А происходит все это на венде?


Название: Re: Подвисает GUI при удерживании мышкой окна
Отправлено: kkmple от Август 21, 2021, 08:15
А происходит все это на венде?
Да


Название: Re: Подвисает GUI при удерживании мышкой окна
Отправлено: Old от Август 21, 2021, 09:39
Я не пользуюсь вендой, но насколько я помню, это не исправить и отдельным потоком. Сам я сталкивался с этим давно, еще на XP.
Может на современных вендах что-то изменилось, но тогда можно было только помахать микрософту рукой. :)


Название: Re: Подвисает GUI при удерживании мышкой окна
Отправлено: sergek от Август 21, 2021, 09:43
Работу с железом надо из гуевого потока выносить.


Название: Re: Подвисает GUI при удерживании мышкой окна
Отправлено: kkmple от Август 21, 2021, 10:26
Спасибо за ответы.  Попробую для qSerial отдельный поток сделать.


Название: Re: Подвисает GUI при удерживании мышкой окна
Отправлено: kkmple от Август 23, 2021, 13:04

в конструкторе mainwindow

QThread *thread_NEW = new QThread;
    m_ComPort->moveToThread(thread_NEW); // помещаем класс  в поток
    m_ComPort->getSerialPort()->moveToThread(thread_NEW); //помещаем порт в поток.
    thread_NEW->start();


в созданном потоке считываются данные с ком порта и заполняются поля структуры.

В основном потоке гуя с помощью указателя на стуктуру которую заполняет второй поток.
С помощью Qtimer c частотой 10мс я обновляю виджеты.

id_потока_1 - это поток гуя, который обновляет виджеты.
id_потока_2 - это поток для работы с ком портом, вывожу в дебагер каждый раз когда я делаю readALL();

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

После чего при  n-ом(пытался найти закономерность не нашел)
повторном захвате окна мышкой, я вижу, что выполняется второй поток,
а первый не выполняется(предполагаю, что дочитывает буфер). пик(3)

после чего потоки начинает выполнятся как мне нужно - могу без проблем перетаскивать окно,
все виджеты обновляются и буфер не переполняется. пик(4);


Прошу помощи, что-то я совсем потерялся.

(http://pic_one)
(http://pic_two)
(http://pic_tree)
(http://pic_four)





Название: Re: Подвисает GUI при удерживании мышкой окна
Отправлено: kuzulis от Август 24, 2021, 17:25
Цитата: Old
Я не пользуюсь вендой, но насколько я помню, это не исправить и отдельным потоком.

Не, все исправляется потоком. Там суть была в том, что раньше QSP использовал QWinOverlappedIoNotifier (на базе Windows IOCP подсистемы), и тогда все было нормуль... Потом кутешники решили выкинуть этот приватный класс  (типа им было влом его поддерживать) и перейти на alertable I/O (на основе {Read|Write}FileEx), на коллбеках. Я тоже перевел QSP на эти ф-ции. Но при этом да, начали блокироваться события при клике на заголовок окна или ресайзе окна. Там проблема в самом Qt event-loop, там шото накосячено и типа оно не может обрабатывать события от соседних фреймов/окон или как-то так. Там даже QTimer останавливался при кликах.

И там один чувак (по моему Антон Кудрявцев, ЕМНИП) пытался все пофиксить Qt evenl loop, там было дохрена всяких патчей.. Чем закончилось не знаю, но вроде они подлечили другой класс QWinEventNotifier чтобы он не останавливался при кликах и типа убрали что-ли ограничение на максимальное кол-во хендлов у треда (было вроде 64).

И теперь типо надо перевести QSP на этот  QWinEventNotifier, но никто этим заниматься не спешит (т.к. я тоже больше не поддерживаю QSP).

Так что вот так.  :(

Цитата: kkmple
в конструкторе mainwindow

Попробуй с чего нить простого. Например, просто выводи данные принимаемые QSP без всякой обработки и парсинга.

И там не нужно два объекта в тред сувать. Если твой класс ComPort является враппером над QSP, то достаточно:

1. В QSP установить парентом ComPort в конструкторе
2. Достаточно мувнуть только один ComPort в тред

Цитата: kkmple
С помощью Qtimer c частотой 10мс я обновляю виджеты.

Гы, а ты проверь шо и таймер не останавливается при кликах (раньше такое было)  :)


Название: Re: Подвисает GUI при удерживании мышкой окна
Отправлено: tux от Август 24, 2021, 18:39
И теперь типо надо перевести QSP на этот  QWinEventNotifier, но никто этим заниматься не спешит (т.к. я тоже больше не поддерживаю QSP).
А какой в этом великий смысл в мультиплатформенной библиотеке? Опять будет 100500 ifdef...


Название: Re: Подвисает GUI при удерживании мышкой окна
Отправлено: kkmple от Август 24, 2021, 21:31
И снова спасибо за ответы.
Вычитал у Шлее qapp-> processevents(), хоть он и не рекомендует.
Добавил qapp->processevents() после каждого тика таймера перед тем как отображать в виджеты.
Теперь при перетаскивании подвисает ровно один раз, ~на пол секунды. Буфер не успевает переполнится, пакеты не теряются).
После этой задержки я не отпускаю окно, по размеру вижу что буфер полностью вычитывается все данные отображаются)

Завтра попробую

И там не нужно два объекта в тред сувать. Если твой класс ComPort является враппером над QSP, то достаточно:

1. В QSP установить парентом ComPort в конструкторе
2. Достаточно мувнуть только один ComPort в тред

Гы, а ты проверь шо и таймер не останавливается при кликах (раньше такое было)  :)


О результатах отпишусь)


Название: Re: Подвисает GUI при удерживании мышкой окна
Отправлено: kuzulis от Август 25, 2021, 09:42
Цитата: tux
А какой в этом великий смысл в мультиплатформенной библиотеке? Опять будет 100500 ifdef...

С точки зрения пользователя - он не заметит разницы.. Только заметит улучшения в том что не будут блокироваться события.


Название: Re: Подвисает GUI при удерживании мышкой окна
Отправлено: tux от Август 25, 2021, 10:35
С точки зрения пользователя - он не заметит разницы.. Только заметит улучшения в том что не будут блокироваться события.
Я не про это. Я про "никто этим заниматься не спешит". Потому и не спешат, что библиотека должна быть мультиплатформенна. А этот косяк в винде уже длится 100500 времени и будет вечен, видимо.


Название: Re: Подвисает GUI при удерживании мышкой окна
Отправлено: sergek от Август 27, 2021, 23:59
Мне что-то не нравится время 10 мс. Последовательный порт весьма не быстрая штука, может стоит замедлить обмен?