Erreur de fonction de sumil en C

J’ai un fichier de données Dump, avec différentes données horodatées disponibles, j’obtiens l’heure de l’horodatage et je dors mon thread c pour cette période. Mais le problème est que la différence de temps réelle est de 10 secondes et les données que je reçois à la réception sont presque 14, 15 secondes de retard. J’utilise un OS de fenêtre. Veuillez me guider.

Désolé pour ma semaine en anglais.

Si je comprends bien:

  • vous avez un thread qui envoie des données (via le réseau? quelle est la source des données?)
  • vous ralentissez l’envoi en utilisant le sumil
  • les données reçues (à l’autre bout du réseau) peuvent être retardées beaucoup plus (15 s au lieu de 10 s)

Si ce qui précède décrit ce que vous faites, votre conception comporte plusieurs défauts:

  • le sumil est très imprécis, il faudra attendre au moins n secondes, mais cela peut être plus (surtout si votre système est chargé par d’autres applications en cours d’exécution).
  • les réseaux introduisent un délai de mise en mémoire tampon, vous n’avez aucune garantie que vos données seront envoyées immédiatement sur le câble (généralement ce n’est pas le cas).
  • le voyage lui-même introduit un certain délai (latence), si votre protocole attend ACK du destinataire, vous devez en tenir compte.
  • Vous devez également prendre en compte le temps nécessaire pour lire / construire / récupérer des données à envoyer et les envoyer sur le réseau. Selon ce que vous faites, cela peut être négligeable ou prendre quelques secondes …

Si vous donnez plus de détails, il sera plus facile de diagnostiquer la source du problème. sleep comme vous le croyez (c’est en effet une timer vraiment médiocre) ou une autre partie de votre système.

Si votre fichier est volumineux, je parierai que le temps supplémentaire vient de la lecture des données et de leur envoi par câble. Vous devez mesurer le temps consommé dans le processus d’envoi (temps de lecture avant et après la fin de l’envoi).

S’il s’agit bien de la source du temps supplémentaire, il vous suffit de supprimer ce délai de la prochaine fois pour attendre.

Exemple: L’envoi du bloc de données précédent a pris 4 secondes, le bloc suivant est 10 secondes plus tard, mais comme vous avez déjà consommé 4 secondes, il vous suffit d’attendre 6 secondes.

sleep est toujours un minuteur imprécis et, de toute évidence, le mécanisme ci-dessus ne fonctionnera pas si le temps d’envoi est plus long que le délai entre les envois, mais vous avez une idée.

Le sumil de correction n’est pas si mauvais dans un environnement Windows que dans unix. La précision de Windows sleep est une milliseconde, la précision du sumil unix est la seconde. Si vous n’avez pas besoin d’un minutage de haute précision (et si le réseau est impliqué, un chronométrage de haute précision est de toute façon hors d’atteinte) le sumil devrait être correct.

La fonction de veille va dormir au moins aussi longtemps que le temps que vous spécifiez, mais rien ne garantit qu’elle ne dormira pas plus longtemps. Si vous avez besoin d’un intervalle précis, vous devrez utiliser un autre mécanisme.

Tout programmateur de système d’exploitation multitâches moderne ne garantira aucun délai exact pour les applications utilisateur. Vous pouvez essayer d’atsortingbuer une priorité en temps réel à votre application, par exemple, à partir d’un gestionnaire de tâches Windows. Et voyez si ça aide.

Une autre solution consiste à mettre en œuvre un mode de veille «contrôlé», c’est-à-dire à dormir une série de 500 ms, en vérifiant l’horodatage actuel entre eux. ainsi, si vous dormez tous un 1 au lieu de 500 ms à un moment donné – vous le remarquerez et ne ferez pas de sumil supplémentaire (500 ms).

Essayez une timer multimédia . Il est à peu près aussi précis que possible sur un système Windows. Il y a un bon article sur CodeProject à leur sujet.

La fonction de sumil peut prendre plus de temps que demandé, mais jamais moins. Utilisez les fonctions du minuteur winapi pour récupérer une fonction dans un intervalle à partir de maintenant.

Vous pouvez également utiliser le planificateur de tâches Windows, mais cela va au-delà des options autonomes programmatiques.