在不同的线程中使用QUdpSocket可以吗?

雅鲁科

我想要一个QUdpSocket,但是在这样的不同线程中读取/写入数据:

void UDPLink::writeBytes(const char* data, qint64 size)
{
    // Broadcast to all connected systems
    for (int h = 0; h < hosts.size(); h++)
    {
        QHostAddress currentHost = hosts.at(h);
        quint16 currentPort = ports.at(h);
        socket->writeDatagram(data, size, currentHost, currentPort);
    }
}

void UDPLink::readBytes()
{
    while (socket->hasPendingDatagrams())
    {
        QByteArray datagram;
        datagram.resize(socket->pendingDatagramSize());

        QHostAddress sender;
        quint16 senderPort;
        socket->readDatagram(datagram.data(), datagram.size(), &sender, &senderPort);

        // FIXME TODO Check if this method is better than retrieving the data by individual processes
        emit bytesReceived(this, datagram);
     }
}

readBytes()触发插座的readyRead信号。但是writeBytes在工作线程中,而readBytes在主线程中。这个可以吗?

杰里米·弗里斯纳(Jeremy Friesner)

但是writeBytes在工作线程中,而readBytes在主线程中。这个可以吗?

如果您使用的是原始POSIX套接字(例如,一个int文件描述符和BSD套接字API的sendto()调用),那就可以了。但是,QudpSocket是从QObject派生的,并且QObjects不能同时由多个线程访问。特别是,快速看一下QUdpSocket :: writeDatagram()方法的实现,就会发现该方法可以完成诸如底层套接字的延迟初始化,文件描述符的缓存以及信号的发出之类的操作,而这些操作中的任何一个都可能与同时进行的交互作用很差。给定正确的(错误的?)时间,从另一个线程进行的非同步访问。您的代码可能无法做到这一点,但是我不相信它可以一直或在所有系统上可靠地工作。

我的建议是创建两个QUdpSocket对象,一个用于发送,一个用于接收。这将确保避免争用条件,并且额外的QUdpSocket对象并不是让您高枕无忧的巨大代价。

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

在Java枚举中使用==可以吗?

在Angular中使用getElementById可以吗?

在我的应用程序中使用两个不同版本的okhttp库可以吗?

在项目中使用未使用的组件可以吗?

在JavaScript中使用名为“ arguments”的参数可以吗?

在@Configuration类中使用@Autowire或@Inject可以吗

在单元测试中使用SpringRunner可以吗?

在 make 调用中使用 BUILD_MODE 可以吗?

在 redux 中使用 reducer 进行后端调用可以吗?

在 RecyclerView 的 ViewHolder 的布局中使用 <fragment> 标签可以吗?

在Drupal 8中使用$ _SESSION ['variables']可以吗?

在uwp中使用Directory.GetCurrentDirectory()可以吗?

在Cloud Functions中使用setTimeout可以吗?

在Cats-Effects中使用“ unsafeRunSync()”可以吗?

在函数或类中使用`useDispatch`可以吗?

在MySQLi中使用5 INNER JOIN可以吗?

使用printf可以吗?

使用pageswitch可以吗?

在单个页面中使用Vue.js和jQuery可以,但是它们各自处理不同的Element(DOM)可以吗?

在多线程和高负载情况下使用Java文件io可以吗?

多个python线程同时写入同一列表中的不同记录-可以吗?

在<>中使用对象名称,因为新的ArrayList <String>是正确的,或者只使用<>可以吗?

从后台线程访问[UIApplication sharedApplication]可以吗?

在Swing工作线程之外更改模型可以吗?

在后台线程上创建UIViewController可以吗?

在本地使用lambda可以吗?

使用LinearLayout代替FrameLayout可以吗?

使用模块命名空间,可以吗?

使用可以吗?每个方法