0

我在清除QLocalSocket时遇到问题。

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

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

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

但似乎QLocalSocket参考中没有功能。

如何清除套接字?

4

1 回答 1

0

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

我正在这样做:

在发件人方面,您有:

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 事件循环在关闭套接字句柄后会删除它,而不是删除弄乱套接字的私有数据)

于 2017-05-09T15:59:48.977 回答