"Michael Lazzaro" <[EMAIL PROTECTED]> wrote in>     # But if you want
to get the thread object, so you can monitor it's

>     {
>         ...
>         my $tid = thread &slow_func_impl(...);
>         while $tid.active {
>             status_monitor($tid.progress);
>             sleep 60;
>         }
>         return $tid.result;
>     }
>
> To my eye, that looks pretty darn slick.

You might be a bit frustrated if the &slow_func_impl took 61 seconds :-(.
How do we interrupt the C<sleep>? Possibly in the same way as we'd timeout a
blocking IO operations. But I wonder if this could work:

  my $tid = thread &slow_func_impl(...);
  until wait $tid, timeout=>60
  {
          status_monitor($tid.progress);
  }
  return $tid.result;

Here I assume that C<wait> returns a true value if its waited condition
occurs, but false if it times out.

Hmm, A few days ago I tried indroducing a syntax for thread with a
sensitivity list in place of an explict loop-forever thread. Perhaps I can
reuse that syntax:

  my $tid = thread &slow_func_impl(...);
  thread $tid | timeout(60)
  {
          when $tid => { return $tid.result }
          default => { status_monitor $tid.progress }
  }

Perhaps a different keyword would be better: C<always> as the looping
counterpart to C<wait> -- then extend C<wait> to accept a code block.

Dave.


Reply via email to