0
我在清除QLocalSocket時遇到問題。如何清除QLocalSocket?
現在我發送&通過接收圖像數據QLocalServer/QLocalSocket。
但在接收程序,由於內存中堆積的圖像數據,內存增加很多。
所以,我想在數據讀取時清理套接字。
但似乎沒有功能在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事件循環一旦關閉,刪除套接字句柄並且不會刪除套接字的私有數據)