sleep mit 0 -> WARNING: sleep without additional commands is deprecated and blo

Begonnen von vbs, 03 März 2017, 17:51:28

Vorheriges Thema - Nächstes Thema

vbs

Hab mich gerade über folgendes gewundert:
Wenn ich ein sleep mit Wert 0 mache, dann kommt folgende Meldung:
2017.03.03 17:48:39.400 1: WARNING: sleep without additional commands is deprecated and blocks FHEM

Also ausgelöst durch z.B.:
sleep 0;set wz_tv off

Ist das Absicht? Kommt in meinem Fall vor, weil ich den Parameter für sleep in Perl-Code dynamisch erzeuge und es gibt auch den Fall 0. Müsste ich sonst im Code so bauen, dass das sleep im Fall von 0 ganz weggelassen wird.

DeeSPe

0 ist halt kein gültiger Wert würde ich meinen.
Würde das, wie Du schon geschrieben hast, umbauen dass das sleep dann ganz wegfällt. Ist die "saubere" Lösung.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

vbs

Hm, wüsste eigentlich nicht, was an sleep 0 ungültig sein sollte. Mir fällt jetzt spontan auch keine andere Sprache ein, die das als ungültig ansieht. Wird sogar bewusst zugelassen, um kontrolliert die CPU freizugeben (anstelle von yield).

Auch im FHEM fände ich es sehr nützlich um FHEM nicht zu blockieren wenn ich eine Vielzahl von Befehlen aus Perl heraus absenden möchte. Wenn zB "set bla1 on;set bla2 on; set bla3 on" eine längere Abarbeitung benötigen würde, könnte man die Befehle mit "sleep 0;set bla1 on" regulär in FHEM's Event-Queue einreihen, so dass zwischen den Befehlen andere Module Events abarbeiten können. Oder?

DeeSPe

Habe gerade mal den Code angeschaut:

sub
CommandSleep($$)
{
  my ($cl, $param) = @_;
  my ($sec, $id, $quiet) = split(" ", $param, 3);
  if( $id && $id eq 'quiet' ) {
    $quiet = $id;
    $id = undef;
  }

  return "Argument missing" if(!defined($sec));
  return "Cannot interpret $sec as seconds" if($sec !~ m/^[0-9\.]+$/);
  return "Last parameter must be quiet" if($quiet && $quiet ne "quiet");

  Log 4, "sleeping for $sec";

  if(@cmdList && $sec && $init_done) {
    my %h = (cmd          => join(";", @cmdList),
             evalSpecials => $evalSpecials,
             quiet        => $quiet,
             id           => $id);
    if( $id ) {
      RemoveInternalTimer( $sleepers{$id} ) if( $sleepers{$id} );
      $sleepers{$id} = \%h;
    }
    InternalTimer(gettimeofday()+$sec, "WakeUpFn", \%h, 0);
    @cmdList=();

  } else {
    Log 1,
     "WARNING: sleep without additional commands is deprecated and blocks FHEM";
    select(undef, undef, undef, $sec);

  }
  return undef;
}


Ich denke da fehlt das defined:


  Log 4, "sleeping for $sec";

  if(@cmdList && defined $sec && $init_done) {


Evtl. mal Rudi als Verbesserung vorschlagen.

Gruß
Dan
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

Thorsten Pferdekaemper

Hi,
CommandSleep in fhem.pl:

  if(@cmdList && $sec && $init_done) {

     [...] 

  } else {
    Log 1,
     "WARNING: sleep without additional commands is deprecated and blocks FHEM";
    select(undef, undef, undef, $sec);

  }

In $sec stehen die Sekunden. 0 Sekunden wird also absichtlich so interpretiert. Das wundert mich ein bisschen, weil es ja tatsächlich eine schöne Möglichkeit wäre, eine Art yield zu machen. Vielleicht aus dem sleep 0 ein sleep 0.01 machen...
Oder diesen Thread mal ins Development-Forum verschieben. Vielleicht überlegt es sich Rudi ja nochmal.
Gruß,
   Thorsten
FUIP

Thorsten Pferdekaemper

Zitat von: DeeSPe am 03 März 2017, 19:17:44
Ich denke da fehlt das defined:
Naja, das wird vorher schon abgefangen:

return "Argument missing" if(!defined($sec));
FUIP

DeeSPe

Zitat von: Thorsten Pferdekaemper am 03 März 2017, 19:19:03
Naja, das wird vorher schon abgefangen:

return "Argument missing" if(!defined($sec));


Ja und? 0 bleibt 0 und wenn es nicht noch mal mit defined abgefragt wird dann wird der Schleifenteil eben nicht abgearbeitet.

Gruß
Dan


EDIT: if(0) ist immer false.
MAINTAINER: 22_HOMEMODE, 98_Hyperion, 98_FileLogConvert, 98_serviced

Als kleine Unterstützung für meine Programmierungen könnt ihr mir gerne einen Kaffee spendieren: https://buymeacoff.ee/DeeSPe

rudolfkoenig

Das mit sleep 0 kam mir wohl beim bauen von sleep komisch vor, und habs deswegen unterbunden.
Weiss aber nicht mehr wieso, und habe es jetzt ausgebaut.


Thorsten Pferdekaemper

Zitat von: DeeSPe am 03 März 2017, 19:23:32
Ja und? 0 bleibt 0 und wenn es nicht noch mal mit defined abgefragt wird dann wird der Schleifenteil eben nicht abgearbeitet.
Ja, schon klar. Was ich meinte ist: Bevor man nochmal auf defined abfragt kann man es auch gleich ganz weglassen.
Gruß,
   Thorsten
FUIP