FHEM Forum

FHEM => Automatisierung => Thema gestartet von: klausw am 12 Januar 2014, 18:58:05

Titel: RemoveInternalTimer
Beitrag von: klausw am 12 Januar 2014, 18:58:05
Hallo,

RemoveInternalTimer("timername") sollte doch den Timer mit dem "timername" löschen.

Ich habe den Timer angelegt:
InternalTimer( gettimeofday() +$to, "AAA_ReceiveTimeout", $hash, 0);

In der ReadFn wird er gelöscht:
RemoveInternalTimer("AAA_ReceiveTimeout");

Das die ReadFn ausgelöst wird habe ich über einen Logeintrag sichergestellt.
Allerdings läuft der Timer weiter und löst schließlich aus.

was habe ich übersehen?
Titel: Antw:RemoveInternalTimer
Beitrag von: fhainz am 12 Januar 2014, 19:21:17
Versuch mal RemoveInternalTimer($hash);

Grüße
Titel: Antw:RemoveInternalTimer
Beitrag von: klausw am 12 Januar 2014, 19:26:11
da lösche ich doch aber alle Timer der Modulinstanz, oder?
Titel: Antw:RemoveInternalTimer
Beitrag von: Dietmar63 am 12 Januar 2014, 20:19:42
ja, deshalb kannst du diese Fuktionen vielleicht verwenden:


################################################################################
sub myInternalTimer($$$$$) {
   my ($modifier, $tim, $callback, $hash, $waitIfInitNotDone) = @_;

   my $mHash;
   if ($modifier eq "") {
      $mHash = $hash;
   } else {
      my $timerName = "$hash->{NAME}_$modifier";
      if (exists  ($hash->{TIMER}{$timerName})) {
          $mHash = $hash->{TIMER}{$timerName};
      } else {
          $mHash = { HASH=>$hash, NAME=>"$hash->{NAME}_$modifier", MODIFIER=>$modifier};
          $hash->{TIMER}{$timerName} = $mHash;
      }
   }
   InternalTimer($tim, $callback, $mHash, $waitIfInitNotDone);
}
################################################################################
sub myRemoveInternalTimer($$) {
   my ($modifier, $hash) = @_;

   my $timerName = "$hash->{NAME}_$modifier";
   if ($modifier eq "") {
      RemoveInternalTimer($hash);
   } else {
      my $myHash = $hash->{TIMER}{$timerName};
      if (defined($myHash)) {
         delete $hash->{TIMER}{$timerName};
         RemoveInternalTimer($myHash);
      }
   }
}


werden so verwendet:

 
myRemoveInternalTimer    ("perlTime", $hash);
myInternalTimer          ("perlTime", $tim-60*60, "Twilight_WeatherTimerUpdate", $hash, 0);

Titel: Antw:RemoveInternalTimer
Beitrag von: klausw am 12 Januar 2014, 23:00:26
Hallo Dietmar,

klappt super, danke
Titel: Antw:RemoveInternalTimer
Beitrag von: klausw am 13 Januar 2014, 00:01:04
beim genaueren hinschauen doch nicht  :(
Die Subroutine, welche beim Timeout aufgerufen wird bekommt ja den $mHash übergeben. Aber ich benötige den $hash der Modulinstanz.
Titel: Antw:RemoveInternalTimer
Beitrag von: Dietmar63 am 13 Januar 2014, 00:21:07
der richtige hash wird in der Funktion gesichert, und man muss leider im timerCallback dereferenzieren.

sub xxx_calback($)
{
  my ($myHash) = @_;
  my $hash = $myHash->{HASH};
  my $hashName = $hash->{NAME};
  Log 3, "hashName------------>$hashName";

Das kann man leider nicht anders lösen. Besser wäre es Varianten dieser Funktionen nach fhem.pl zu übernehmen. Aber ich kann Rudi nicht überzeugen, und komme auch so klar.
Titel: Antw:RemoveInternalTimer
Beitrag von: klausw am 13 Januar 2014, 00:29:28
er hat sicher seine Gründe und ich habe zu wenig Ahnung für eine Diskussion  ;D
Danke Nochmals!
Titel: Antw:RemoveInternalTimer
Beitrag von: Dietmar63 am 13 Januar 2014, 00:35:40
sicher!
Probier mal ob es klappt!
Titel: Antw:RemoveInternalTimer
Beitrag von: rudolfkoenig am 13 Januar 2014, 07:32:51
Ich empfehle fuer solche Faelle einen Aufruf-spezifischen Parameter (hash) anzulegen, und irgendwo zu merken.
Titel: Antw:RemoveInternalTimer
Beitrag von: Dietmar63 am 13 Januar 2014, 07:59:55
Genau so funktionieren die beiden Funktionen.
Titel: Antw:RemoveInternalTimer
Beitrag von: klausw am 14 Januar 2014, 18:51:28
Klappt super Dietmar
Danke Dir!
Titel: Antw:RemoveInternalTimer
Beitrag von: Dietmar63 am 14 Januar 2014, 19:21:38
wenn du es in deinem Modul freigibst müssen wir eventuell noch den Modulnamen davorpacken, damit wir keine Redefines bekommen.