Je dois implémenter un client qui lit les données à 300 Hz (300 échantillons par seconde). Lorsque je travaillais avec des sockets C, tout allait bien accepter le fait que j'ai besoin d'exécuter une boucle while continue pour obtenir les données du serveur (ce qui empêche le client de gérer quoi que ce soit d'autre). J'ai donc décidé d'essayer de passer à QTcpsocket, afin de gérer les signaux provenant d'autres objets vers l'objet client. Mais quand je connecte le QTcpSocket et connecter le signal pour la lectureUtilisation de QTcpSocket pour une utilisation rapide continue
connect(socket,&QTcpSocket::readyRead, this, &client::handleReadyRead, Qt::ConnectionType::QueuedConnection);
c'est mon gestionnaire -
QByteArray b = socket->read(12);
int packetLength = (unsigned char)b[6] << CHAR_BIT;
packetLength |= (unsigned char)b[7];
b = socket->read(packetLength);
(je reçois un pour chaque paquet tête longue de 12 octets) Maintenant, je reçois très client lent - Il gère environ peut-être 3 échantillons par seconde ... J'ai vérifié pour voir combien retourne bytesavailable()
, et il semble que les données s'accumulent dans le tampon de sockets. Qu'est-ce que je fais de mal? Je dois obtenir un client très rapide, mais je ne suis pas sûr que la façon dont je lis est optimale. Existe-t-il un moyen plus efficace de le faire?
Merci
Profil de votre application et voir où se trouve le goulot d'étranglement. –
Je suis en train d'utiliser un mini-projet pour le tester, donc c'est à peu près le fonctionnement du client. Le profilage montre que la boucle d'événements prend beaucoup de temps, mais peut-elle être évitée? – JLev
Vous appelez 'socket-> read (packetLength)' sans savoir si les octets 'packetLength' sont disponibles ou non. Si ce n'est pas le cas, la lecture suivante ne sera plus synchronisée avec le flux de données. –