QT中解决QSocketNotifier: socket notifiers cannot be enabled from another thread错误

class UDPReceive : public QThread
{
    Q_OBJECT
public:
    UDPReceive();
    UDPReceive(QUdpSocket *s);
protected:
    virtual void run();
private:
    QUdpSocket *udp_socket;  
};
UDPReceive::UDPReceive(){}
UDPReceive::UDPReceive(QUdpSocket *s)
{
    this->udp_socket = s;
}
void UDPReceive::run()
{    
    while(1)    
    {                        
        if (udp_socket->hasPendingDatagrams())        
        {            
            if (udp_socket->pendingDatagramSize() >= rev_length)            
            {                                
                 ......            
            }        
        }            
    }
}
//在mainwindow中调用UDPReceive
void MainWindow::init_socket()
{
    udp_socket = new QUdpSocket(this);
    udp_socket->bind(QHostAddress::Any, UDP_LISTEN_PORT, QUdpSocket::ReuseAddressHint);
    QHostAddress mcast_addr("224.0.0.17");
    //udp_socket->setSocketOption(QAbstractSocket::MulticastLoopbackOption, 0);//禁止本机接收
    udp_socket->joinMulticastGroup(mcast_addr);
    udp_receive = new UDPReceive(udp_socket);
    udp_receive->start();
}

    以上程序在运行时报QSocketNotifier: socket notifiers cannot be enabled from another thread错误。 

    到网上查了查,原因应该是,不能跨线程调用QObject。mainwindow为窗口主线程,UDPReceive为数据传输线程,所以当我们在mainwindow中创建udp_socket,然后通过指针的方式传递给UDPReceive使用,属于跨线程调用QObject。    

    解决办法为:将新建upd套接字的相关代码移到UDPReceive中,这样就避免了跨线程调用QObject。

void UDPReceive::run()
{
    QUdpSocket udp_socket;
    udp_socket.bind(QHostAddress::Any, this->udp_listen_port, QUdpSocket::ReuseAddressHint);
    QHostAddress mcast_addr("224.0.0.17");
    udp_socket.setSocketOption(QAbstractSocket::MulticastLoopbackOption, 0);//禁止本机接收
    udp_socket.joinMulticastGroup(mcast_addr);

    int rev_length = msg_max_length * 2 + 6;
    while(1)
    {
        if (udp_socket.hasPendingDatagrams())
        {
            if (udp_socket.pendingDatagramSize() >= rev_length)
            {
            }
        }
    }
} 
  • 17
    点赞
  • 60
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值