Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1617 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Executer une action toute les X secondes

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Executer une action toute les X secondes

n°1562804
nORKy
Grmmph...
Posté le 21-05-2007 à 10:38:21  profilanswer
 

Bonjour,
 
Actuellement, un programme avec un thread unique.
Ce programme utilise select sur une socket ouverte.
Ce programme possède des modules (un peu comme apache quoi, des .so qu'on peut charger comme on vuet) et chaque module est appelé en fonction de ce que recoit la socket, et chaque module peut demandé d'envoyé qqchose dans la socket (j'utilise un tampon, et lorsque la socket etre prete en écriture, je dépile un élément du tanpon et ainsi de suite..)
 
Je voudrais rajouté la possibilité à ces modules, d'exécuté une fonction toute les X secondes.
Ma question est : comment ?
Sachant que si j'utilise une fonction telle que sigalarm, il faut que je sois en mesure de savoir pour quel module je vais travailler (pour pouvoir récuper les infos du module, or sigalarm ne prends pas de void *). Et il faut aussi que globalement (je suis pas à la ms pret), le temps doit être respecter (sachant que le processus, il s'occupe également de la socket)
Donc, sigalarm était-elle la seule solution ?
Ne serait-il pas interessant d'utiliser le timeout du select ?
autre solution ? un thread dédié pt etre ?
 
Merci

mood
Publicité
Posté le 21-05-2007 à 10:38:21  profilanswer
 

n°1562997
Sve@r
Posté le 21-05-2007 à 15:31:08  profilanswer
 

nORKy a écrit :

Bonjour,
 
Actuellement, un programme avec un thread unique.
Ce programme utilise select sur une socket ouverte.
Ce programme possède des modules (un peu comme apache quoi, des .so qu'on peut charger comme on vuet) et chaque module est appelé en fonction de ce que recoit la socket, et chaque module peut demandé d'envoyé qqchose dans la socket (j'utilise un tampon, et lorsque la socket etre prete en écriture, je dépile un élément du tanpon et ainsi de suite..)
 
Je voudrais rajouté la possibilité à ces modules, d'exécuté une fonction toute les X secondes.
Ma question est : comment ?
Sachant que si j'utilise une fonction telle que sigalarm, il faut que je sois en mesure de savoir pour quel module je vais travailler (pour pouvoir récuper les infos du module, or sigalarm ne prends pas de void *). Et il faut aussi que globalement (je suis pas à la ms pret), le temps doit être respecter (sachant que le processus, il s'occupe également de la socket)
Donc, sigalarm était-elle la seule solution ?
Ne serait-il pas interessant d'utiliser le timeout du select ?
autre solution ? un thread dédié pt etre ?
 
Merci


 
sigalarm ne prend pas de void * mais initialise un timer qui t'enverra un signal "SIGALRM" au bout de "x" secondes.
Tu peux créer une fonction "void attente(int sig)" que tu associe au signal SIGALRM via un "signal(SIGALRM, attente)"
Ensuite, dès que ta fonction "attente" est appelée, elle analyse le module à exécuter (en passant hélas par des variables globales ou par tout autre moyen de communication interprocessus car une fonction appelée depuis un signal ne peut recevoir qu'un seul paramètre)


---------------
Vous ne pouvez pas apporter la prospérité au pauvre en la retirant au riche.
n°1563015
nORKy
Grmmph...
Posté le 21-05-2007 à 15:43:31  profilanswer
 

J'ai bien compris tt cela, mais mon problème, c'est que plusieurs SIGALRM peuvent donc être en attente par un ou plusieurs module X/Y. Mon truc est de savoir pour quelle demande précise ma fonction va être appelé.
 
Si un module A demande l'apelle de la fonction X dans 20 secondes.
10 secondes.
Au moment ou X est appelé, comment je sais que c'est toto ou tutu qu'il l'a demandé ?

n°1563087
matafan
Posté le 21-05-2007 à 17:07:19  profilanswer
 

Avec timer_create() tu peux donner un pointeur vers un sigevent qui sera passé au handler quand le signal est délivré.

n°1563329
nORKy
Grmmph...
Posté le 22-05-2007 à 10:47:16  profilanswer
 

ok, j'ai vu ce que c'était dispo sur linux. Mais pas sur BSD :-( une idée ?

n°1564766
xilebo
noone
Posté le 24-05-2007 à 17:43:22  profilanswer
 

tu peux créer un gestionnaire de timer avec un thread, et la fonction usleep. Par contre, attention si tu as besoin de précision, je n'arrive pas à avoir de timer précis au dela de 10ms environ.
Sinon, tu peux utiliser les signaux, mais attention, les appels systèmes sont interrompus lorsque ton application recoit un signal, avec comme valeur de retour errno == EINTR.

n°1566090
nORKy
Grmmph...
Posté le 28-05-2007 à 12:02:30  profilanswer
 

merci, ca m'aide ce que tu me dis.
Je vais essayer avec un thread, à mon avis ca sera le plus simple.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Executer une action toute les X secondes

 

Sujets relatifs
[Résolu] Executer un BACTH en VB (Visual Basic 2005 Express)VB 2005 Express -> demande code pour executer un BATCH
[Resolu] VB 2005 Express -> demande code pour écrire ds le RegistreExecuter un programme en C via PHP
executer une simple requete sql avec javascript[Resolu]executer script sur machine distante
[Résolu][Débutant C#] - Requete SQLexécuter un programme exe sur serveur
[html] executer ou pas le fichier index.htmdiaporama en action script
Plus de sujets relatifs à : Executer une action toute les X secondes


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR