Le composant TTimer sous delphi est un composant capable de faire un appel régulier et répétitif à une procédure utilisateur.
Le délai entre les appels est réglable. Le principe de fonctionnement est simple : il s'agit de créer une fenêtre non visible, associée à une procédure de fenêtre (wndproc) capable de gérer le message WM_TIMER. En initialise les appels ensuite avec une api praticulière de windows. Le noyau Windows va,à partir de là, envoyer régulièrement un message WM_TIMER à cette fenêtre.
Ceci étant vu, je vais vous proposer maintenant de reproduire ce type de comportement sur linux.
Ce système peut quand à lui répondre à des signaux extérieur à l'application. Ces signaux peuvent être détournés par le programme vers une fonction de gestion. Si le programme ne le fait pas, le noyau tue l'application. C'est ainsi que fonctionne CTRL+C qui envoie à l'application courante un SIGINT, le signal d'arrêt du programme. Si le programme n'a pas de gestion particulière de ce signal, le noyau va effectivement stopper le programme. Si le programme gère ce signal, le programmeur devra prévoir une stratégie de sortie.
Revenons au timer. Il existe un signal SIGALRM qui est envoyé régulièrement par le noyau à une application. Ce signal sera envoyé sur demande de l'application. Bien entendu, comme tout signal, s'il n'est pas géré par l'application, il provoquera l'arrêt du programme. Si on le détourne vers une fonction, cette fonction sera appelée régulièrement.
Voici un exemple de source C sur l'utilisation des alarmes sous linux:
/*
=============================================================================
Name : timer.c
Author : OT
Description : Comment coder l'équivalent du TTimer de delphi en c sous linux ?
=============================================================================
*/
#include stdio.h>
#include stdlib.h>
#include signal.h>
#include sys/types.h>
#include unistd.h>
#include errno.h>
#include sys/wait.h>
void evenementTimer() {
printf("Top timer\n");
alarm(1);
}
int main(void) {
signal(SIGALRM, evenementTimer);
alarm(1);
// c'est mal de faire une attente active....
for (;;) {
}
}
