QThead QUdpSocket多线程组播小例子

来源:互联网 发布:倩女幽魂手游mac版 编辑:程序博客网 时间:2024/05/22 06:57

QThread多线程的使用方法有多种。

这里是一个简单的在多线程中建立组播的例子。


组播发送程序:

    QUdpSocket *socket=new QUdpSocket;    while(1)    {        QThread::sleep(1);        QString s=QTime::currentTime().toString();        int re=socket->writeDatagram(s.toUtf8(),QHostAddress("224.2.2.2"),62224);//                int re=socket->writeDatagram(s.toUtf8(),QHostAddress::LocalHost,62224);       if(re==-1)           qDebug()<<"send failed--";       else           qDebug()<<"send ok--"<<s;    }

组播发送socket不需要加入组播,只要向组播地址发送数据即可。


组播接收:

void Thread::run(){    //打印当前线程指针地址    qDebug()<<"void Thread::run()--"<<currentThread();    //socket作为成员变量,实例化socket    socket=new QUdpSocket;    //socket再加入组播之前,需要先绑定网络地址和端口    if(!socket->bind(QHostAddress::AnyIPv4,62224,QAbstractSocket::ShareAddress))        qDebug()<<"bind failed--";    //socket调用joinMulticastGroup加入组播    if(!socket->joinMulticastGroup(QHostAddress("224.2.2.2")))        qDebug()<<"joinMuticastGroup failed--";    //连接socket的信号readRead到线程的槽函数slotRead上    //并且指定信号槽连接模式为Qt::DirectConnection    connect(socket,SIGNAL(readyRead()),this,SLOT(slotRead()),Qt::DirectConnection);    //启动线程的事件循环,只有这样,该线程中的slotRead槽函数才会被调用到    exec();}

这里重点讲一下socket信号槽函数的连接模式 Qt::DirectConnection ,当信号发送的时候,槽函数被立即执行,则不会进入到其他线程中执行。
另外一定需要注意的是,socket的实例化以及socket绑定地址端口加入组播地址等操作都要在run函数中执行,否则被认为在跨线程调用socket。




1 0
原创粉丝点击