Ограничения QUdpSocket в высокочастотных средахC++

Программы на C++. Форум разработчиков
Ответить Пред. темаСлед. тема
Anonymous
 Ограничения QUdpSocket в высокочастотных средах

Сообщение Anonymous »

У меня есть задача обработки данных UDP со скоростью чтения ~ 10 кГц. Я работаю с Qt 5.13.1 (MinGW32), поэтому попробовал использовать QUdpSocket.

Я сделал простую тестовую программу, но результаты немного разочаровывают. Сигнал ReadyRead() слишком медленный. По какой-то причине я получаю задержки более 1 или 2 мс на каждые 2-4 сигнала.

Я сделал простой счетчик пакетов и сравнил его с тем, что вижу в Wireshark. Конечно же, происходит потеря пакетов.

Что я могу сделать, чтобы повысить производительность? Или, может быть, это просто предел цикла событий Qt?

Я запускаю его с помощью Qt Creator 4.10.0. В Windows 7.

Обновление: С вашими советами: попробовал:
  • Перемещение сокета в другую ветку. Это дает немного больше производительности
    .. совсем немного
  • LowDelayOption = 1 — я не заметил никаких изменений
    ReceiveBufferSizeSocketOption — никаких изменений не заметил
  • QDebug при чтении не использовался — не проверял, просто использую для
    коллекционирование статистика
udppproc.h

#ifndef UDPPROC_H
#define UDPPROC_H

#include "QObject"
#include "QUdpSocket"
#include "QHostAddress"
#include "QThread"

#include "QDebug"
#include "networker.h"

class UDPProc : public QObject
{
Q_OBJECT
public:
UDPProc();
~UDPProc();
private:
QUdpSocket dataServerSocket;
NetWorker* netWorker;
QThread netThread;

};

#endif // UDPPROC_H


udpproc.cpp

UDPProc::UDPProc()
{

netWorker = new NetWorker(&dataServerSocket);
netWorker->moveToThread(&netThread);
netWorker->getInnerLoop()->moveToThread(&netThread);

connect(&netThread, SIGNAL(started()), netWorker, SLOT(serverSocketProccessing()));
connect(&this->dataServerSocket, SIGNAL(readyRead()), netWorker->getInnerLoop(), SLOT(quit()));

QString address = "127.0.0.3:16402";
QHostAddress ip(address.split(":").at(0));
quint16 port = address.split(":").at(1).toUShort();
dataServerSocket.bind(ip, port);

//dataServerSocket.setSocketOption(QAbstractSocket::LowDelayOption, 1);
dataServerSocket.moveToThread(&netThread);

netThread.start();

//dataServerSocket.setSocketOption(QAbstractSocket::ReceiveBufferSizeSocketOption, 128000);
//qDebug()pendingDatagramSize());
}
if (times.size() >= 10000){
long long sum = 0;
for (int x : times){
//qDebug()

Подробнее здесь: https://stackoverflow.com/questions/585 ... nviroments
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C++»