<?php
include_once $_SERVER['DOCUMENT_ROOT'] . '/include/shared-manual.inc';
$TOC = array();
$TOC_DEPRECATED = array();
$PARENTS = array();
include_once dirname(__FILE__) ."/toc/book.ev.inc";
$setup = array (
  'home' => 
  array (
    0 => 'index.php',
    1 => 'PHP Manual',
  ),
  'head' => 
  array (
    0 => 'UTF-8',
    1 => 'es',
  ),
  'this' => 
  array (
    0 => 'ev.periodic-modes.php',
    1 => 'Modos de operaci&oacute;n peri&oacute;dica de un watcher',
    2 => 'Modos de operaci&oacute;n peri&oacute;dica de un watcher',
  ),
  'up' => 
  array (
    0 => 'book.ev.php',
    1 => 'Ev',
  ),
  'prev' => 
  array (
    0 => 'ev.watcher-callbacks.php',
    1 => 'Las funciones de retrollamada de un Watcher',
  ),
  'next' => 
  array (
    0 => 'class.ev.php',
    1 => 'Ev',
  ),
  'alternatives' => 
  array (
  ),
  'source' => 
  array (
    'lang' => 'es',
    'path' => 'reference/ev/periodic-modes.xml',
  ),
  'history' => 
  array (
  ),
);
$setup["toc"] = $TOC;
$setup["toc_deprecated"] = $TOC_DEPRECATED;
$setup["parents"] = $PARENTS;
manual_setup($setup);

contributors($setup);

?>
<div id="ev.periodic-modes" class="chapter">
 <h1 class="title">Modos de operación periódica de un watcher</h1>

 <p class="simpara">
  El watcher <span class="classname"><a href="class.evperiodic.php" class="classname">EvPeriodic</a></span> funciona en diferentes
  modos según los parámetros <code class="parameter">offset</code>,
  <code class="parameter">interval</code> y <code class="parameter">reschedule_cb</code>.
 </p>
 <ol type="1">
  <li class="listitem">
   <span class="simpara">
    El modo <em>Temporizador absoluto</em>. En este modo,
    <code class="parameter">interval</code> = <code class="literal">0</code>,
    <code class="parameter">reschedule_cb</code> = <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong>.
    La llamada se realizará a la hora del reloj <code class="parameter">offset</code>
    y no se repetirá. No se ajustará cuando ocurra un salto en el tiempo,
    por lo tanto, si debe ejecutarse el <em>1 de enero de 2014</em>,
    se ejecutará cuando la hora del sistema sea alcanzada o superada.
   </span>
  </li>
  <li class="listitem">
   <span class="simpara">
    El modo <em>Temporizador con repetición por intervalo</em>.
    En este modo, <code class="parameter">interval</code> &gt; <code class="literal">0</code>,
    <code class="parameter">reschedule_cb</code> = <strong><code><a href="reserved.constants.php#constant.null">null</a></code></strong> ; el watcher será programado
    automáticamente para finalizar en la próxima duración
    <code class="parameter">offset</code> + <strong><code>N</code></strong> * <code class="parameter">interval</code>
    (para un entero <strong><code>N</code></strong>) y luego se repite, independientemente
    de los saltos en el tiempo.
   </span>
   <p class="para">
    Puede utilizarse para crear temporizadores que no derivan respetando
    el reloj del sistema:
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br />$hourly </span><span style="color: #007700">= </span><span style="color: #0000BB">EvPeriodic</span><span style="color: #007700">(</span><span style="color: #0000BB">0</span><span style="color: #007700">, </span><span style="color: #0000BB">3600</span><span style="color: #007700">, </span><span style="color: #0000BB">NULL</span><span style="color: #007700">, function () {<br />  echo </span><span style="color: #DD0000">"una vez por hora\n"</span><span style="color: #007700">;<br />});<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

    Esto no significa que siempre habrá <code class="literal">3600</code> segundos
    entre cada llamada, sino solo que la función de retrollamada será llamada
    cuando el reloj del sistema muestre una hora completa (<em>UTC</em>).
   </p>
   <span class="simpara">
    La clase <span class="classname"><a href="class.evperiodic.php" class="classname">EvPeriodic</a></span> intentará ejecutar la función
    de retrollamada en este modo a la próxima hora posible donde
    <var class="varname">time</var> = <code class="parameter">offset</code> (<code class="literal">mod</code>
    <code class="parameter">interval</code>), independientemente de los saltos en el tiempo.
   </span>
  </li>
  <li class="listitem">
   <span class="simpara">
    El modo <em>reprogramación manual</em>. En este modo,
    <code class="parameter">reschedule_cb</code> es un <span class="type"><a href="language.types.callable.php" class="type callable">callable</a></span>.
   </span>
   <span class="simpara">
    <code class="parameter">interval</code> y <code class="parameter">offset</code>
    serán ambos ignorados. En su lugar, cada vez que el watcher periódico
    esté programado, la función de retrollamada de reprogramación (<code class="parameter">reschedule_cb</code>)
    será llamada con el watcher primero y el tiempo actual como segundo argumento.
   </span>
   <span class="simpara">
    Esta función de retrollamada <em>no debe</em> detener ni destruir
    este watcher periódico, ni otro, y <em>no debe</em>
    llamar a funciones o métodos de bucle de eventos. Para detenerlo,
    devuelva <code class="literal">1e30</code> y deténgalo después. Un watcher
    <span class="classname"><a href="class.evprepare.php" class="classname">EvPrepare</a></span> puede ser utilizado para realizar esta tarea.
   </span>
   <span class="simpara">
    Debe devolver la próxima hora de llamada, basada en el valor
    del tiempo pasado (el valor de tiempo más pequeño debe ser superior
    o igual al segundo argumento). Será llamada, habitualmente, justo después
    de que la función de retrollamada sea lanzada, pero posiblemente en otros momentos.
   </span>
   <div class="example" id="example-1">
    <p><strong>Ejemplo #1 Utilización de retrollamada de reprogramación</strong></p>
    <div class="example-contents">
<div class="phpcode"><code><span style="color: #000000"><span style="color: #0000BB">&lt;?php<br /></span><span style="color: #FF8000">// Cada 10.5 segundos<br /><br /></span><span style="color: #007700">function </span><span style="color: #0000BB">reschedule_cb </span><span style="color: #007700">(</span><span style="color: #0000BB">$watcher</span><span style="color: #007700">, </span><span style="color: #0000BB">$now</span><span style="color: #007700">) {<br />   return </span><span style="color: #0000BB">$now </span><span style="color: #007700">+ (</span><span style="color: #0000BB">10.5 </span><span style="color: #007700">- </span><span style="color: #0000BB">fmod</span><span style="color: #007700">(</span><span style="color: #0000BB">$now</span><span style="color: #007700">, </span><span style="color: #0000BB">10.5</span><span style="color: #007700">));<br />}<br /><br /></span><span style="color: #0000BB">$w </span><span style="color: #007700">= new </span><span style="color: #0000BB">EvPeriodic</span><span style="color: #007700">(</span><span style="color: #0000BB">0.</span><span style="color: #007700">, </span><span style="color: #0000BB">0.</span><span style="color: #007700">, </span><span style="color: #DD0000">"reschedule_cb"</span><span style="color: #007700">, function (</span><span style="color: #0000BB">$w</span><span style="color: #007700">, </span><span style="color: #0000BB">$revents</span><span style="color: #007700">) {<br />   echo </span><span style="color: #0000BB">time</span><span style="color: #007700">(), </span><span style="color: #0000BB">PHP_EOL</span><span style="color: #007700">;<br />});<br /><br /></span><span style="color: #0000BB">Ev</span><span style="color: #007700">::</span><span style="color: #0000BB">run</span><span style="color: #007700">();<br /></span><span style="color: #0000BB">?&gt;</span></span></code></div>
    </div>

   </div>
  </li>
 </ol>
</div>
<?php manual_footer($setup); ?>