Информация об изменениях

Сообщение Re: прием udp в потоке от 16.11.2021 7:07

Изменено 16.11.2021 7:08 Igore

Re: прием udp в потоке
Здравствуйте, 00011011, Вы писали:

0>Сделал прием udp в отдельном потоке. Но стабильно ловится только первый пакет.

0>Дальше начинается странное — иногда, если походить в отладке, вновь приходим в слот приема. Если без отладки, то не приходит больше одного раза.
0>Ранее реализованный прием без потока работает идеально. В программе отправки уверен, она написана давно и не на Qt, многократно проверена, умеет отправлять и принимать по udp пакеты. В том числе сама себе через локалхост.
class Receiver : public QObject
{
    Q_OBJECT

public:
    Receiver(QObject *parent);
    ~Receiver();

    unsigned long m_Size = 0;
    void start();
public slots:
    void doStart();
    void onReceive();
private:
    QScopedPointer<QUdpSocket> m_pSocket;
};

Receiver::Receiver(QObject *parent)
    : QObject(parent)
{
}

Receiver::~Receiver()
{
}

Receiver::start()
{
    QMetaObject::invokeMethod(this, "doStart", Qt::QueuedConnection);
}

Receiver::stop()
{
    QMetaObject::invokeMethod(this, "doStop", Qt::QueuedConnection);
}


void Receiver::doStart()
{
    m_pSocket.reset( new QUdpSocket() );
    m_pSocket->bind(QHostAddress::Any, 7000);
    connect(m_pSocket, &QUdpSocket::readyRead, this, &Receiver::onReceive);
}

void Receiver::doStop()
{
    m_pSocker.reset();
}

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;
    }
}

0>запуск всего этого снаружи, из главного (gui) потока. m_Receiver это переменная класса главного окна.
Receiver m_Receiver;
QThread m_Thread;

m_Receiver.moveToThread( &m_Thread );
m_Receiver.start();
m_Thread.start();

m_Receiver.stop();
m_Thread.quit();
m_Thread.waitForFinished();

А если так попробовать?
Re: прием udp в потоке
Здравствуйте, 00011011, Вы писали:

0>Сделал прием udp в отдельном потоке. Но стабильно ловится только первый пакет.

0>Дальше начинается странное — иногда, если походить в отладке, вновь приходим в слот приема. Если без отладки, то не приходит больше одного раза.
0>Ранее реализованный прием без потока работает идеально. В программе отправки уверен, она написана давно и не на Qt, многократно проверена, умеет отправлять и принимать по udp пакеты. В том числе сама себе через локалхост.
class Receiver : public QObject
{
    Q_OBJECT

public:
    Receiver(QObject *parent);
    ~Receiver();

    unsigned long m_Size = 0;
    void start();
public slots:
    void doStart();
    void onReceive();
private:
    QScopedPointer<QUdpSocket> m_pSocket;
};

Receiver::Receiver(QObject *parent)
    : QObject(parent)
{
}

Receiver::~Receiver()
{
}

Receiver::start()
{
    QMetaObject::invokeMethod(this, "doStart", Qt::QueuedConnection);
}

Receiver::stop()
{
    QMetaObject::invokeMethod(this, "doStop", Qt::QueuedConnection);
}


void Receiver::doStart()
{
    m_pSocket.reset( new QUdpSocket() );
    m_pSocket->bind(QHostAddress::Any, 7000);
    connect(m_pSocket.data(), &QUdpSocket::readyRead, this, &Receiver::onReceive);
}

void Receiver::doStop()
{
    m_pSocker.reset();
}

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;
    }
}

0>запуск всего этого снаружи, из главного (gui) потока. m_Receiver это переменная класса главного окна.
Receiver m_Receiver;
QThread m_Thread;

m_Receiver.moveToThread( &m_Thread );
m_Receiver.start();
m_Thread.start();

m_Receiver.stop();
m_Thread.quit();
m_Thread.waitForFinished();

А если так попробовать?