KirillMB
@KirillMB

QUdpSocket в потоке?

Добрый день.
Ест класса запускаемый в отдельном потоке, в нем создаются UDP сокеты, и слушаются.
Пакеты идут, но у сокетов не вызывается сигнал readyRead.

h
class ReadImit : public QObject
{
    Q_OBJECT
public:
    explicit ReadImit(QObject *parent = 0);
    
signals:
    void f1(s1Data);
    void f2(s2Data);
public slots:


private slots:
    void readPendingDatagramsIP1();
    void readPendingDatagramsIP2();

private:
    QUdpSocket* udpSocketIP1;
    QUdpSocket* udpSocketIP2;
};

class ControlReadImit: public QThread
{
    Q_OBJECT

public:
    ControlReadImit()
    {
        qRegisterMetaType< s1Data> ("s1Data");
        qRegisterMetaType< s2Data> ("s2Data");
    }

signals:
// signal to thread

// signal from thread
    void f1(s1Data);
    void f2(s2Data);

private:
    void run()
    {
        ReadImit threadReadImit;
        // signal from thread
        connect(&threadReadImit, SIGNAL(f1(s1Data)), this, SIGNAL(f1(s1Data)));
        connect(&threadReadImit, SIGNAL(f2(s2Data)), this, SIGNAL(f2(s2Data)));

//исправление по комментарию
       exec();
    }
};


cpp
ReadImit::ReadImit(QObject *parent) :
    QObject(parent)
{
    udpSocketIP1 = new QUdpSocket(this);
    udpSocketIP1->bind(QHostAddress::Any, PORT_IP1);

    udpSocketIP2 = new QUdpSocket(this);
    udpSocketIP2->bind(QHostAddress::Any, PORT_IP2);

    connect(udpSocketIP1, SIGNAL(readyRead()), SLOT(readPendingDatagramsIP1()));
    connect(udpSocketIP2, SIGNAL(readyRead()), SLOT(readPendingDatagramsIP2()));
}

void ReadImit::readPendingDatagramsIP1()
{
    while (udpSocketIP1->hasPendingDatagrams()) {
        ......
       }
}


void ReadImit::readPendingDatagramsIP2()
{
    while (udpSocketIP2->hasPendingDatagrams()) {
         ......
       }
}
  • Вопрос задан
  • 4549 просмотров
Пригласить эксперта
Ответы на вопрос 2
@rosperitus
Попробуйте в bind третьим параметром указать QUdpSocket::DontShareAddress.
.. и мне кажется у вас socket не в thread'е создается, или писать без потоков или moveToThread
Ответ написан
@DancingOnWater
Все просто, у вас функция run не входит eventloop, а сразу после коннектов завершается.
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы