Bonjour,

Je dois superviser l'état d'une com. Pour cela, je dois checker l'arrivée d'un message toutes les n secondes.
si je ne reçois pas un message dans ces n secondes => PANNE
Sinon => MARCHE (et je réarme le timer)

Je voudrais savoir si il y a des gens qui ont une super idée de comment faire.

De mon côté, j'ai réfléchi et je vois une solution à base de timeout"
comme (très bien) expliqué dans ce thread => http://www.developpez.net/forums/d36...-timeout-perl/
et d'attente active de n secondes ... (avec un USleep toutes les 100ms) où je regarde l'état d'une variable (combiné avec un sémaphore pour gérer le cas de changement d'étazt de la variable).

Ok c'est capilo tracté mais je pense que l'algo est viable (pas encore testé, si vous voyez un bug, dites le moi).

1) Si je reçois un message : je mets à jour la variable et par conséquent je sors de l'attente active et je relance mon timeout avec la même sub
2) je ne reçois pas de messaghe : je pète en timeout et je fais mon traitement d'erreur.

D'un point de vue algo, ça donnerait un truc comme ça:
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
 
# pour gérer l'attente active
  my $superVar= 0;
 
# pour gérer le cas où le message arrive pendant le sleep de l'attente active.
 my $s = Thread::Semaphore->new();
 
 
 
sub receptionMessage()
{
  // libération de l'attente active
  $superVar=1;
   // P
  $s->down()
  attenteTimer();
   // V
  $s->up()
 
}
 
sub attenteTime()
{
  // positionement pour l'attente active
  $superVar=0;
 
eval{
  local $SIG{ALRM} = sub { die "Timed out\n" };
  alarm(5);
  my $sentry = Object::Destroyer->new( sub {alarm(0)} );
 
    // ---> attente active toute pourrie
    while (superVar == 0 )
    {
      // avec le sleep qui va bien
    }
 
   // Ok la com est viable
};
 
  if( $@ ) {
     #... 
     // traitement de panne de la com
   }
}
Si je poste ici c'est pour savoir si il y a d'autres façons de faire. Je ne suis pas fan des attentes actives.

Cordialement