我在清除 QLocalSocket 方面遇到了问题。
现在我发送&通过 QLocalServer / QLocalSocket 接收图像数据。
但是在接收程序中,由于内存中堆积的图像数据,内存会大量增加。
所以,我想在读取数据时清理套接字。
但似乎 QLocalSocket 引用中没有任何功能。
如何清除插座?
答案 0 :(得分: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*)¤tFrame, sizeof(currentFrame)) > 0) {
}
}
其中currentFrame是预定义数据的已知结构。
这对我来说不是最优雅的解决方案,我仍在研究如何避免无限的new / deleteLater操作。但是如果没有它们,我会在发送方那边得到随机写入错误(看起来Qt事件循环正在删除套接字句柄,一旦它被关闭而没有被删除搞乱套接字的私有数据)