прием udp в потоке
От: 00011011  
Дата: 15.11.21 13:36
Оценка:
Сделал прием udp в отдельном потоке. Но стабильно ловится только первый пакет.
Дальше начинается странное — иногда, если походить в отладке, вновь приходим в слот приема. Если без отладки, то не приходит больше одного раза.
Ранее реализованный прием без потока работает идеально. В программе отправки уверен, она написана давно и не на Qt, многократно проверена, умеет отправлять и принимать по udp пакеты. В том числе сама себе через локалхост.
class Receiver : public QThread
{
    Q_OBJECT

public:
    Receiver(QObject *parent);
    ~Receiver();
    unsigned long m_Size;
protected:
    virtual void run();
public slots:
    void onReceive();
private:
    QUdpSocket *m_pSocket;
};

Receiver::Receiver(QObject *parent)
    : QThread(parent)
{
    m_pSocket = nullptr;
    m_Size = 0;
}

Receiver::~Receiver()
{
    quit();
    wait();
}

void Receiver::run()
{
    m_pSocket = new QUdpSocket;
    m_pSocket->bind(QHostAddress::Any, 7000);
    connect(m_pSocket, &QUdpSocket::readyRead, this, &Receiver::onReceive);
    
    exec();

    disconnect(m_pSocket, &QUdpSocket::readyRead, this, &Receiver::onReceive);
    delete m_pSocket;
    m_pSocket = nullptr;
}

void Receiver::onReceive()
{
    while (m_pSocket->hasPendingDatagrams()) {
        QByteArray data;
        int size = m_pSocket->pendingDatagramSize();
        data.resize(size);
        m_pSocket->readDatagram(data.data(), size);
        m_Size += size;
    }
}

запуск всего этого снаружи, из главного (gui) потока. m_Receiver это переменная класса главного окна.
m_Receiver.start();
Отредактировано 15.11.2021 13:38 00011011 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.