Сообщение прием udp в потоке от 15.11.2021 13:36
Изменено 15.11.2021 13:38 00011011
прием udp в потоке
Сделал прием udp в отдельном потоке. Но стабильно ловится только первый пакет.
Дальше начинается странное — иногда, если походить в отладке, вновь приходим в слот приема. Если без отладки, то не приходит больше одного раза.
Ранее реализованный прием без потока работает идеально. В программе отправки уверен, она написана давно и не на Qt, многократно проверена, умеет отправлять и принимать по udp пакеты. В том числе сама себе через локалхост.
запуск всего этого снаружи, из главного (gui) потока —
Дальше начинается странное — иногда, если походить в отладке, вновь приходим в слот приема. Если без отладки, то не приходит больше одного раза.
Ранее реализованный прием без потока работает идеально. В программе отправки уверен, она написана давно и не на 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.start();
прием udp в потоке
Сделал прием udp в отдельном потоке. Но стабильно ловится только первый пакет.
Дальше начинается странное — иногда, если походить в отладке, вновь приходим в слот приема. Если без отладки, то не приходит больше одного раза.
Ранее реализованный прием без потока работает идеально. В программе отправки уверен, она написана давно и не на Qt, многократно проверена, умеет отправлять и принимать по udp пакеты. В том числе сама себе через локалхост.
запуск всего этого снаружи, из главного (gui) потока. m_Receiver это переменная класса главного окна.
Дальше начинается странное — иногда, если походить в отладке, вновь приходим в слот приема. Если без отладки, то не приходит больше одного раза.
Ранее реализованный прием без потока работает идеально. В программе отправки уверен, она написана давно и не на 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();