• 7857阅读
  • 3回复

如何用另一个线程监听和接收UDP的数据? [复制链接]

上一主题 下一主题
离线jktong
 
只看楼主 倒序阅读 楼主  发表于: 2010-08-07
各位大虾!
用另一个线程来监听和接收UDP数据,该如何实现?
能不能写个例子,或者提供一下思路。谢谢!!!
离线jktong
只看该作者 1楼 发表于: 2010-08-08
自己顶一个
离线XChinux

只看该作者 2楼 发表于: 2010-08-08
看着Qt自己带的示例就可以。
二笔 openSUSE Vim N9 BB10 XChinux@163.com 网易博客 腾讯微博
承接C++/Qt、Qt UI界面、PHP及预算报销系统开发业务
离线jktong
只看该作者 3楼 发表于: 2010-08-08
回 2楼(XChinux) 的帖子
好像qt自己带的例子只有TCP的,UDP的没有。我自己写了个
dialog.h头文件:
#ifndef DIALOG_H
#define DIALOG_H

#include <QtGui/QDialog>
#include "thread.h"
class QLabel;
class QLineEdit;

class Dialog : public QDialog
{
    Q_OBJECT

public:
    Dialog(QWidget *parent = 0);
    ~Dialog();

private slots:
    void set();
private:
    QLabel *label;
    QLineEdit *t;
    QPushButton *btn;
    Thread thread;
};

class Temp
{
public:
    static QString str;
};


#endif // DIALOG_H

thread.h头文件:
#ifndef THREAD_H
#define THREAD_H
#include <QThread>
#include <QtGui>
#include <QUdpSocket>
class Thread : public QThread
{
    Q_OBJECT

public:
    Thread();

protected:
    void run();
signals:
    void ok();

private slots:
    void processPendingDatagrams();

private:
    QUdpSocket *udpSocket;
};

#endif // THREAD_H

dialog.cpp源文件:
#include "dialog.h"
#include <QtGui>

Dialog::Dialog(QWidget *parent)
    : QDialog(parent)
{
    label=new QLabel(tr("现在时间:"));
    t=new QLineEdit;
    btn=new QPushButton(tr("close"));

    connect(&thread,SIGNAL(ok()),this,SLOT(set()));
    connect(btn,SIGNAL(clicked()),this,SLOT(close()));
    QHBoxLayout *h=new QHBoxLayout;
    h->addWidget(label);
    h->addWidget(t);
    QVBoxLayout *v=new QVBoxLayout;
    v->addLayout(h);
    v->addWidget(btn);
    setLayout(v);
    resize(200,60);
    this->setWindowTitle(tr("时钟"));

}

Dialog::~Dialog()
{

}

void Dialog::set()
{
    t->setText(Temp::str);
}

thread.cpp源文件:
#include "thread.h"
#include "dialog.h"
#include <QObject>
Thread::Thread()
{
    start();
}

void Thread::run()
{
    udpSocket=new QUdpSocket(0);
    udpSocket->bind(5824);
    connect(udpSocket,SIGNAL(readyRead()),this,SLOT(processPendingDatagrams()));
    exec();

}

void Thread::processPendingDatagrams()
{

        QByteArray datagram;

        do {
            datagram.resize(udpSocket->pendingDatagramSize());
           udpSocket->readDatagram(datagram.data(), datagram.size());
        } while (udpSocket->hasPendingDatagrams());

        QDateTime dateTime;
        //QString d;

        QDataStream in(&datagram, QIODevice::ReadOnly);
        in.setVersion(QDataStream::Qt_4_3);
        in >> dateTime ;

        Temp::str=dateTime.time().toString();
        emit ok();

}

mian.cpp源文件:
#include <QtGui/QApplication>
#include "dialog.h"
#include <QtCore/QTextCodec>
#include "thread.h"
QString Temp::str="123";
int main(int argc, char *argv[])
{
    QApplication a(argc, argv);
    QTextCodec::setCodecForTr(QTextCodec::codecForName("utf-8"));
    Dialog w;
    w.show();

    return a.exec();
}

运行是可以运行,也能接收数据。
不过,关闭窗口时,会发生这个提示:QThread: Destroyed while thread is still running
快速回复
限100 字节
 
上一个 下一个