2016-12-09 69 views
0

我在清除QLocalSocket時遇到問題。如何清除QLocalSocket?

現在我發送&通過接收圖像數據QLocalServer/QLocalSocket

但在接收程序,由於內存中堆積的圖像數據,內存增加很多。

所以,我想在數據讀取時清理套接字。

但似乎沒有功能在QLocalSocket參考。

如何清除插座?

回答

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事件循環一旦關閉,刪除套接字句柄並且不會刪除套接字的私有數據)