2016-12-09 4 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 удалял дескриптор сокета, когда он был закрыт, а не удалялся, испортил личные данные сокета)

Смежные вопросы