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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Подвисает GUI при удерживании мышкой окна  (Прочитано 4727 раз)
kkmple
Новичок

Offline Offline

Сообщений: 6


Просмотр профиля
« : Август 21, 2021, 00:02 »

Доброго времени суток. Используя readyRead и ReadAll() забираю все с com порта. Далее прохожусь парсером и вывожу на виджеты, всего порядка 30 постоянно меняющихся значений. Если я захватываю окно мышкой, мои данные перестают отображаться. В qDebug() я вижу что после отпускания мышкой, буфер куда я делаю readALL() разрастается до 12000(80 при нормальной работе) и я ловлю битый пакет.
После чего вычитывая парсером буфер уменьшается.
Как избежать подвисаний? Начинать читать про потоки? Но на форуме добрая половина тем о том что не нужно использовать потоки вместе qSerialPort.  Шокированный Непонимающий
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #1 : Август 21, 2021, 03:56 »

А происходит все это на венде?
Записан
kkmple
Новичок

Offline Offline

Сообщений: 6


Просмотр профиля
« Ответ #2 : Август 21, 2021, 08:15 »

А происходит все это на венде?
Да
Записан
Old
Джедай : наставник для всех
*******
Online Online

Сообщений: 4350



Просмотр профиля
« Ответ #3 : Август 21, 2021, 09:39 »

Я не пользуюсь вендой, но насколько я помню, это не исправить и отдельным потоком. Сам я сталкивался с этим давно, еще на XP.
Может на современных вендах что-то изменилось, но тогда можно было только помахать микрософту рукой. Улыбающийся
Записан
sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #4 : Август 21, 2021, 09:43 »

Работу с железом надо из гуевого потока выносить.
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
kkmple
Новичок

Offline Offline

Сообщений: 6


Просмотр профиля
« Ответ #5 : Август 21, 2021, 10:26 »

Спасибо за ответы.  Попробую для qSerial отдельный поток сделать.
Записан
kkmple
Новичок

Offline Offline

Сообщений: 6


Просмотр профиля
« Ответ #6 : Август 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);


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








Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #7 : Август 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мс я обновляю виджеты.

Гы, а ты проверь шо и таймер не останавливается при кликах (раньше такое было)  Улыбающийся
« Последнее редактирование: Август 25, 2021, 09:46 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
tux
Global Moderator
Бывалый
*****
Offline Offline

Сообщений: 404



Просмотр профиля
« Ответ #8 : Август 24, 2021, 18:39 »

И теперь типо надо перевести QSP на этот  QWinEventNotifier, но никто этим заниматься не спешит (т.к. я тоже больше не поддерживаю QSP).
А какой в этом великий смысл в мультиплатформенной библиотеке? Опять будет 100500 ifdef...
Записан

kkmple
Новичок

Offline Offline

Сообщений: 6


Просмотр профиля
« Ответ #9 : Август 24, 2021, 21:31 »

И снова спасибо за ответы.
Вычитал у Шлее qapp-> processevents(), хоть он и не рекомендует.
Добавил qapp->processevents() после каждого тика таймера перед тем как отображать в виджеты.
Теперь при перетаскивании подвисает ровно один раз, ~на пол секунды. Буфер не успевает переполнится, пакеты не теряются).
После этой задержки я не отпускаю окно, по размеру вижу что буфер полностью вычитывается все данные отображаются)

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

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

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

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


О результатах отпишусь)
« Последнее редактирование: Август 24, 2021, 21:33 от kkmple » Записан
kuzulis
Джедай : наставник для всех
*******
Offline Offline

Сообщений: 2812


Просмотр профиля
« Ответ #10 : Август 25, 2021, 09:42 »

Цитата: tux
А какой в этом великий смысл в мультиплатформенной библиотеке? Опять будет 100500 ifdef...

С точки зрения пользователя - он не заметит разницы.. Только заметит улучшения в том что не будут блокироваться события.
« Последнее редактирование: Август 25, 2021, 09:45 от kuzulis » Записан

ArchLinux x86_64 / Win10 64 bit
tux
Global Moderator
Бывалый
*****
Offline Offline

Сообщений: 404



Просмотр профиля
« Ответ #11 : Август 25, 2021, 10:35 »

С точки зрения пользователя - он не заметит разницы.. Только заметит улучшения в том что не будут блокироваться события.
Я не про это. Я про "никто этим заниматься не спешит". Потому и не спешат, что библиотека должна быть мультиплатформенна. А этот косяк в винде уже длится 100500 времени и будет вечен, видимо.
Записан

sergek
Гипер активный житель
*****
Offline Offline

Сообщений: 872


Мы должны приносить пользу людям.


Просмотр профиля
« Ответ #12 : Август 27, 2021, 23:59 »

Мне что-то не нравится время 10 мс. Последовательный порт весьма не быстрая штука, может стоит замедлить обмен?
Записан

Qt 5.13.0 Qt Creator 5.0.1
Win10, Ubuntu 20.04
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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