Bienvenue sur le forum !

Si vous souhaitez rejoindre la communauté, cliquez sur l'un de ces boutons !

Qt 5 : 5.7.1 - Qt Creator : 4.2.0 - Qt Installer : 2.0.3 - JOM : 1.1.2 - Qt Build suite : 1.7.0 - VS Qt 5 : 2.0.0

Optimisation Socket

2 Apr modifié dans Qt / Langage C++
Bonjour,

j'ai développé 2 programmes pour surveiller 24 écrans de manière aussi proche que possible du temps réel, autrement dit rafraichir des copies d'écrans de 24 postes dans une fenêtre de surveillance sur un 25ème appareil. La liaison utilise des sockets. J'ai optimisé le flux. La fenêtre de surveillance contient 24 fenêtres identiques. La taille de ces 24 fenêtres est envoyée à chacun des postes à surveiller. Cela permet de diminuer le nombre d'octets qui transitent. Inutile d'envoyer une image de 1280 x 800 pour afficher dans une fenêtre de 240 x 160. J'utilise également une fonction de stretching (à l'arrivée car rien ne dit que le ratio width/height est identique entre les sources et les cibles) complétée par une fonction de traitement d'image (jpg).

L'optimisation doit me permettre d'obtenir la meilleure fréquence de rafraichissement des fenêtres de l'écran de contrôle sur une période longue.

Le meilleur résultat est obtenu actuellement avec Lazarus, puis Delphi FMX [les 2 utilisant des composants Indy threadés]. Le programme est multiOS. J'ai déjà traduit des bouts de code pour savoir s'il était facile ou non de porter le programme sous Qt. Les sockets Indy sont bloquants d'où l'utilisation de thread. Les QTcpSocket peuvent être utilisés de manière synchrone ou non. Et là commence mon étude et ma question. Enfin non, je voudrais aborder l'étape suivante. En terme d'efficacité par rapport à mon problème exposé ci-dessus, la question se pose-telle ou l'une des 2 approches (synchrone/asynchrone) est-elle sensiblement mieux adaptée à mon problème ?

Merci. AD

Réponses

  • 2 Apr modifié
    Sous Delphi, pour ta solution, je n'aurai pas utilisé Indy mais plutôt ICS qui lui est asynchrone…

    Pour avoir conçu dès solutions en C++ pour des traders à la Bourse de Paris avec des besoins relativement similaire au tient, je pense que l'asynchrone s'impose de lui même…

    Et pour ton cas de figure, j'aurai aussi opté pour de l'UDP plutôt que du TCP car perdre la réception d'une capture de temps en temps n'est pas pénalisant et en UDP tu simplifies grandement le code tout en optimisant le traitement !
  • J'ajoute que je suis curieux du comment tu as gérés les différences entre Lazarus et Firemonkey ;)

    J'ai des projets perso dont je veux placer les sources dans le domaine publique mais tout le monde n'ayant pas de compilateur pour Firemonkey, j'ai installé Lazarus et j'essaie de les convertir, d'où mon intérêt !
  • 2 Apr modifié
    Bonjour,

    alors pour ce projet je suis parti de Lazarus. On peut d'ailleurs utiliser les librairies fcl. Mais comme j'avais l'intention de le porter également en FMX, j'ai choisi Indy que je connais un peu. D'abord il a fallu installer sur Lazarus une Indy10_5410 [https://indy.fulgan.com/ZIP/Indy10_5410.zip]. Toujours aussi facile à installer sous Lazarus : aucun progrès mais quand on on s'est cassé les dents avec les vieilles versions... :-<; En réalité c'est une Indy 10.6.2 comme son N° de version ne l'indique pas :-/. A partir de là, il n'est pas vraiment difficile de porter le code Lazarus en Delphi. Il y a quelque retouches au niveau des librairies graphiques et une au niveau de la synchronisation du thread avec la Form (https://www.developpez.net/forums/d1669884/autres-langages/pascal/lazarus/traduction-d-code-delphi-lazarus/). Je savais le faire en Delphi mais mon code était grossier en Lazarus.

    Les IdTCP présentent des avantages en Lazarus/Delphi par rapport à leur homologue idUDP, notamment TIdCompressionIntercept; Enfin, je n'ai pas vu d'exemple de leur utilisation avec les les TidUDP. Bon évidemment, on peut compresser les flux avant de les envoyer par une méthode non Indy. D"ailleurs à ce sujet, c'est peut-être au niveau des streams que se situe la différence de performance entre Lazarus et FMX. J'avais fait des tests en XE7 et j'étais resté très perplexe sur la gestion FMX... autant d'ailleurs que l'utilisation du LiveBinding sur les Grids à partir de base de données.

    Bon pour en revenir à ma question (avant de se faire rappeler à l'ordre), je regarde UDP et les liaisons asynchrones avec Qt... et je te fais signe sur ce forum si je coince. A bientôt. Merci.
    Cordialement. AD
Connectez-vous ou Inscrivez-vous pour répondre.