0

別の でudpReceiver使用して作成したクラスを使用して、いくつかのパケットを受信しようとしています:qUdpSocketQThread

class udpThread : public QThread
{
private:
    QObject * parent;
public:
    udpThread(QObject * parent = 0)
    {
        this->parent = parent;
    }

    void run()
    {
        UdpReceiver * test = new UdpReceiver(parent);
    }
};


class UdpReceiver : public QObject
{
    Q_OBJECT
private:
    QUdpSocket * S;
    int port;
public:
    UdpReceiver(QObject* parent = 0) : QObject(parent)
    {
        port = 9003;
        initialize();
    }
    UdpReceiver(int p,QObject* parent = 0) : QObject(parent)
    {
        port = p;
        initialize();
    }

    void initialize()
    {
        S = new QUdpSocket();
        S->bind(port);
        S->connect(S,SIGNAL(readyRead()),this,SLOT(readPendingDiagrams()));
        qDebug() << "Waiting for UDP data from port " << port << " ... \n";
    }

public slots:
    void readPendingDiagrams()
    {
        while(S->waitForReadyRead())
        {
            QByteArray datagram;
            datagram.resize(S->pendingDatagramSize());
            QHostAddress sender;
            quint16 senderPort;

            S->readDatagram(datagram.data(), datagram.size(),&sender, &senderPort);
            qDebug() << datagram.size() << " bytes received .... \n";
            qDebug() << " bytes received .... \n";
        }
    }
};

そして、ここにmain()方法があります:

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);



//    UdpReceiver * net = new UdpReceiver();      

    MainWindow w;

    udpThread * ut = new udpThread();
    ut->start();

    w.show();


    return a.exec();
}

クラスを使用しudpReceiverてパケットを取得すると、QThread正常に動作しますが、udpThreadクラスを使用すると、パケットが取得されないか、少なくともraedyread()信号が何らかの方法でアクティブになりません。GUIなしでパケットを取得しようとするQThreadと、どういうわけかクラッシュし、プログラム全体がハングしますQThread。これを解決するのを手伝っていただければ幸いです:)よろしく、

4

2 に答える 2

0

Vahid Nateghi、init コードと作業コードは同じスレッドで実行する必要があります。しかし、UdpReceiver のコンストラクターは、readPendingDiagrams が実行されるメイン スレッドに対して実行されます。これがバグでした。これを試して:

#include <QCoreApplication>
#include <QDebug>
#include <QThread>
#include <QUdpSocket>

class UdpReceiver : public QObject
{
    Q_OBJECT
private:
    QUdpSocket * S;
    int port;
public:
    UdpReceiver(QObject* parent = 0) : QObject(parent)
    {
        qDebug() << ">HERE was the bug! thread:" << QThread::currentThreadId() << "in Construction of UdpReceiver:" << __LINE__ ;
    }

public slots:
    void init_thread(){
        port = 10000;
        qDebug() << ">thread:" << QThread::currentThreadId() << "in init_thread:" << __LINE__ ;
        S = new QUdpSocket();
        S->bind(port);
        S->connect(S,SIGNAL(readyRead()),this,SLOT(readPendingDiagrams()));
        qDebug() << "Waiting for UDP data from port " << port << " ... \n";
    }
    void readPendingDiagrams()
    {
        qDebug() << ">thread:" << QThread::currentThreadId() << "in readPendingDiagrams:" << __LINE__ ;


        while(S->waitForReadyRead())
        {
            QByteArray datagram;
            datagram.resize(S->pendingDatagramSize());
            QHostAddress sender;
            quint16 senderPort;

            S->readDatagram(datagram.data(), datagram.size(),&sender, &senderPort);
            qDebug() << datagram.size() << " bytes received in thread " << QThread::currentThreadId() << "in readPendingDiagrams:" << __LINE__ ;
        }
    }
};

int main(int argc, char *argv[])
{
    qDebug() << ">Main thread:" << QThread::currentThreadId() << "in main:" << __LINE__ ;
    QCoreApplication a(argc, argv);

    QThread *t = new QThread();


    UdpReceiver * net = new UdpReceiver();
    net->moveToThread(t);
    net->connect(t,SIGNAL(started()),net,SLOT(init_thread()));
    t->start();

    return a.exec();
}

#include "main.moc"
于 2016-07-21T14:38:47.860 に答える