【发布时间】:2016-12-09 05:06:42
【问题描述】:
我在清除 QLocalSocket 时遇到问题。
现在我正在通过 QLocalServer/QLocalSocket 发送和接收图像数据。
但在接收程序中,由于内存中堆积的图像数据,内存大量增加。
所以,我想在读取数据时清理套接字。
但 QLocalSocket 参考中似乎没有功能。
如何清除套接字?
【问题讨论】:
标签: sockets initialization qt5 qlocalsocket
我在清除 QLocalSocket 时遇到问题。
现在我正在通过 QLocalServer/QLocalSocket 发送和接收图像数据。
但在接收程序中,由于内存中堆积的图像数据,内存大量增加。
所以,我想在读取数据时清理套接字。
但 QLocalSocket 参考中似乎没有功能。
如何清除套接字?
【问题讨论】:
标签: sockets initialization qt5 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 事件循环在关闭套接字句柄后会删除它,而不是删除会弄乱套接字的私有数据)
【讨论】: