Сообщение Re: прием udp в потоке от 16.11.2021 7:07
Изменено 16.11.2021 7:08 Igore
Re: прием udp в потоке
Здравствуйте, 00011011, Вы писали:
0>Сделал прием udp в отдельном потоке. Но стабильно ловится только первый пакет.
0>Дальше начинается странное — иногда, если походить в отладке, вновь приходим в слот приема. Если без отладки, то не приходит больше одного раза.
0>Ранее реализованный прием без потока работает идеально. В программе отправки уверен, она написана давно и не на Qt, многократно проверена, умеет отправлять и принимать по udp пакеты. В том числе сама себе через локалхост.
0>запуск всего этого снаружи, из главного (gui) потока. m_Receiver это переменная класса главного окна.
А если так попробовать?
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 пакеты. В том числе сама себе через локалхост.
0>запуск всего этого снаружи, из главного (gui) потока. m_Receiver это переменная класса главного окна.
А если так попробовать?
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();
А если так попробовать?