2014-09-10 5 views
-1

J'ai un problème avec la fonction d'exécution toutes les x secondes. Ma demande:Fonction d'exécution toutes les x secondes

  1. créer, socket bind,

  2. écouter sur cette prise,

  3. accepte toutes les connexions entrantes et crée un nouveau thread pour chacun d'eux,

  4. envoyer et recevoir des données,

  5. et maintenant en boucle devrait envoyer données toutes les 1,5 sec, 5 sec et 10 sec.

J'essaie le faire comme ça (où le « temps » doit être le temps en millisecondes/nanosecondes):

while(true) 
{ 
    if(fmod(time, 1.5)==0) 
    { 
     /*sending data*/ 
    } 
    if(fmod(time, 5)==0) 
    { 
     /*sending data*/ 
    } 
    if(fmod(time, 10)==0) 
    { 
     /*sending data*/ 
    } 
} 

Lorsque j'utilise time() les données sont envoyées plusieurs fois par seconde, parce que time() a une précision à une seconde. Pourriez-vous me conseiller quelle fonction je dois utiliser pour obtenir le temps avec une grande précision?

J'utilise Linux

Question 2: Comment puis-je fin au programme (peut-être à l'aide d'une touche) lorsque les discussions en cours d'exécution?

+0

L'heure à laquelle vous parlez est-elle égale à 'std :: time (NULL)' à l'initialisation? Pourriez-vous éditer votre question pour nous montrer la déclaration de cette variable s'il vous plaît? – axelduch

Répondre

1
  1. Votre méthode n'est pas bonne. Tout d'abord, vous ne pouvez pas simplement comparer à zéro en utilisant l'arithmétique en virgule flottante. Vous pouvez obtenir 0,0000000000001 dans les opérations qui devraient retourner zéro. Deuxièmement, si l'un de vos envois se bloque pendant un certain temps, un autre envoi sera en retard. Et enfin, mais pas le moindre - boucle dans un moment est un gaspillage de CPU. A la place, vous pouvez utiliser les fonctions de minuterie Linux et les E/S asynchrones. La meilleure façon de terminer un programme multithread est d'attraper un signal (SIGINT ou SIGTERM ou quoi que vous utilisiez) et d'arrêter tous vos threads, libérer des ressources, puis quitter.

2

1) Eh bien, pour avoir une minuterie de résolution plus élevée, vous pouvez utiliser clock_gettime, un exemple pour obtenir l'horloge en temps réel peut être trouvé here.

2) Je dirais que ce n'est pas un très bon design, pourquoi ne pas utiliser un timer avec un intervalle constant qui serait reprogrammé avec les intervalles de 1.5s, 5s et 10s et effectuerait l'envoi? De cette façon, vous n'avez pas besoin de bloquer le thread principal et pouvez soit attendre la saisie du clavier ou faire ce que vous avez besoin d'attendre la fin.

Questions connexes