protected function tick()
    {
        $time = microtime(true);
        foreach ($this->ticks as $name => $value) {

            /* @var TickInterface $tick */
            $tick     = $value['tick'];
            $interval = $tick->getInterval() >= $this->interval ? $tick->getInterval() : $this->interval;
            $diff     = ($time - $value['time']) * 1000;

            if ($diff >= $interval) {

                try {
                    $tick->tick();
                } catch (\Exception $e) {
                    $this->catchTickException($tick, $e);
                }

                $this->ticks[$name]['time'] = $time;
            }

        }

        usleep($this->interval * 1e3);
    }