Мне нужно реализовать клиент, который считывает данные с частотой 300 Гц (300 выборок в секунду). При работе с сокетами C все было в порядке, учитывая тот факт, что мне нужно запускать непрерывный цикл while для получения данных с сервера (который блокирует клиент от обработки чего-либо еще). Итак, я решил попробовать перейти на QTcpsocket, чтобы обрабатывать сигналы, поступающие от другого объекта к клиентскому объекту. Но когда я подключаю Qtcpsocket и подключаю сигнал для чтения
connect(socket,&QTcpSocket::readyRead, this, &client::handleReadyRead, Qt::ConnectionType::QueuedConnection);
это мой куратор -
QByteArray b = socket->read(12);
int packetLength = (unsigned char)b[6] << CHAR_BIT;
packetLength |= (unsigned char)b[7];
b = socket->read(packetLength);
(Я получаю заголовок длиной 12 байт для каждого пакета) Теперь у меня очень медленный клиент - он обрабатывает примерно 3 выборки в секунду ... Я проверил, сколько возвращается bytesavailable()
, и похоже, что данные накапливаются. в буфере сокетов. Что я делаю неправильно? Мне нужен очень быстрый клиент, но я не уверен, что способ чтения оптимален. Есть ли более эффективный способ сделать это?
Спасибо
socket->read(packetLength)
, не зная, доступны лиpacketLength
байты. В противном случае следующее чтение будет не синхронизировано с потоком данных. - person G.M.   schedule 21.06.2017if (socket->bytesAvailable() >= packetLength){ b = socket->read(packetLength); }
, ничего не изменится - person JLev   schedule 21.06.2017handleReadyRead
реализацию. - person G.M.   schedule 21.06.2017socket->bytesAvailable() >= packetLength
перед чтением недостаточно. Если проверка не удалась, следующийhandleReadyRead
вызов, вероятно, интерпретирует тело пакета как новый заголовок. - person G.M.   schedule 21.06.2017QByteArray b = socket->read(12); int packetLength = (unsigned char)b[6] << CHAR_BIT; packetLength |= (unsigned char)b[7]; if (socket->bytesAvailable() >= packetLength){ b = socket->read(packetLength); }
- person JLev   schedule 22.06.2017