我在清除QLocalSocket时遇到问题。
现在我正在通过QLocalServer/QLocalSocket发送和接收图像数据。
但在接收程序中,由于内存中堆积的图像数据,内存大量增加。
所以,我想在读取数据时清理套接字。
但似乎QLocalSocket参考中没有功能。
如何清除套接字?
我在清除QLocalSocket时遇到问题。
现在我正在通过QLocalServer/QLocalSocket发送和接收图像数据。
但在接收程序中,由于内存中堆积的图像数据,内存大量增加。
所以,我想在读取数据时清理套接字。
但似乎QLocalSocket参考中没有功能。
如何清除套接字?
看起来避免这种行为的唯一方法是关闭套接字(不是命名管道服务器)并在收到足够的数据后再次打开它。另请注意,仅关闭套接字并使用相同的实例(即在堆栈上创建的套接字)给我带来了很多麻烦。
我正在这样做:
在发件人方面,您有:
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 事件循环在关闭套接字句柄后会删除它,而不是删除弄乱套接字的私有数据)