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

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

Страниц: [1]   Вниз
  Печать  
Автор Тема: Прекращение поступления данных в UDP порт (решено)  (Прочитано 5521 раз)
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« : Ноябрь 20, 2020, 09:30 »

QT5.11, Debian, GDB

Клиент слушает UDP порт, принимает данные и обрабатывает. Какое то время может час, а может и несколько дней, все нормально, а потом прием прерывается. В режиме отладчика событие readyRead() не возникает, по крайней мере точка останова не срабатывает.

QByteArray  m_InternalBuffer;   // буфер чтения

Код:
void udpClient::on_readyRead()
{
    m_InternalBuffer.clear();
    while (udpSocket->hasPendingDatagrams())
    {
        QByteArray datagram;
        qint64 l=udpSocket->pendingDatagramSize();
        datagram.resize(l);
        udpSocket->readDatagram(datagram.data(),l);
        m_InternalBuffer.append(datagram);
    }
    if (m_InternalBuffer.size()>0)
    {
        inByte+=m_InternalBuffer.size(); // принято всего

        QString rez=get(m_InternalBuffer);// обработка принятой информации

        // выдача на отображение родителю
        if (rc) QCoreApplication::sendEvent(rc,new Message_send_data(rez,numbKanal,inByte));
        qApp->processEvents();
    }
}


Перезапуск источника UDP не помогает.
Перезапуск приемника UDP - опять нормальная работа какое то время.

Где искать причину и как? Как в отладчике можно найти точку, где сейчас выполняется код запущенного под отладчиком приложения?
« Последнее редактирование: Март 25, 2021, 07:45 от Примерный ученик » Записан

Как мало времени и как много нужно узнать
qate
Супер
******
Offline Offline

Сообщений: 1177


Просмотр профиля
« Ответ #1 : Ноябрь 20, 2020, 21:23 »

может был баг в qt ?
ну и на минимальном примере проверяй, чтобы убрать возможные баги в своем коде
Записан
Примерный ученик
Бывалый
*****
Offline Offline

Сообщений: 450


И это не всегда помогает


Просмотр профиля
« Ответ #2 : Март 25, 2021, 07:53 »

Разобрался. Ошибка в том, что сначала в слоте происходило чтение всего, что пришло, а потом проходила обработка и выход.
Дело в том, что если работает слот, то новая информация добавляется в буфер, но сигнал не испускается. Если выйти из слота, оставив
необработанные данные, то сигнала больше не будет. Буфер не пуст, новые данные добавляются, сигнала нет.
Код:
void udpClient::on_readyRead()
{
    while (udpSocket->hasPendingDatagrams())
    {
        QByteArray datagram;
        qint64 l=udpSocket->pendingDatagramSize();
        datagram.resize(l);
        udpSocket->readDatagram(datagram.data(),l);
        inByte+=l;
        // обработка принятой информации
        get_data(datagram);
    }
}

На всякий случай еще и поставил таймер для принудительной отправки сигнала наличия информации.
Зависаний больше нет.
Записан

Как мало времени и как много нужно узнать
Страниц: [1]   Вверх
  Печать  
 
Перейти в:  


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