【问题标题】:How can i clear QLocalSocket?如何清除 QLocalSocket?
【发布时间】:2016-12-09 05:06:42
【问题描述】:

我在清除 QLocalSocket 时遇到问题。

现在我正在通过 QLocalServer/QLocalSocket 发送和接收图像数据。

但在接收程序中,由于内存中堆积的图像数据,内存大量增加。

所以,我想在读取数据时清理套接字。

QLocalSocket 参考中似乎没有功能。

如何清除套接字?

【问题讨论】:

    标签: sockets initialization qt5 qlocalsocket


    【解决方案1】:

    看起来避免这种行为的唯一方法是关闭套接字(不是命名管道服务器)并在收到足够的数据后再次打开它。另请注意,仅关闭套接字并使用相同的实例(即在堆栈上创建的套接字)给我带来了很多麻烦。

    接下来我会这样做:

    在发送方你有:

    dataSocket->write((char*)data, sizeof(data));
    dataSocket->disconnectFromServer();
    

    在客户端:

    void LocalSocketClient::requestNewFrame()
    {
        if (socket) {
            socket->disconnect();
            socket->deleteLater();
        }
    
        socket = new QLocalSocket();
        dataStream.setDevice(socket);
    
        connect(socket, &QLocalSocket::disconnected, this, &LocalSocketClient::requestNewFrame);
        connect(socket, &QLocalSocket::readyRead, this, &LocalSocketClient::readSocket);
    
        socket->connectToServer(NAMED_PIPE_NAME, QIODevice::ReadOnly);
    }
    
    void LocalSocketClient::readSocket()
    {
        if(dataStream.readRawData((char*)&currentFrame, sizeof(currentFrame)) > 0) {
    
        }
    }
    

    currentFrame 是预定义的已知数据结构。

    对我来说这不是最优雅的解决方案,我仍在研究如何避免无限的 new/deleteLater 操作。但是如果没有它们,我会在发送方收到随机写入错误(看起来 Qt 事件循环在关闭套接字句柄后会删除它,而不是删除会弄乱套接字的私有数据)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2023-04-08
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-03-11
      • 2011-12-24
      • 2011-01-16
      • 2010-11-07
      相关资源
      最近更新 更多