- C ++ - 使用Timer线程启动异常,精度为ms

时间:2015-01-23 22:37:12

标签: c++ c multithreading exception timer

我需要一个计时器,在700 800毫秒后抛出异常,你有什么建议? 有什么东西已经写好了吗?我在提升中搜索,但没有什么有趣的。

我想做的是这样的事情:

void method1(List l) throws TimeoutException{
    Timer t;
      t.start();
    while(!l.isEmpty()){
         //DO SOMETHING
         ...........
     }
     t.stop();
 }

 void method2(List l){
    try{
      method2(l);
     catch(TimeoutException e){
      //do something
      }
  }

1 个答案:

答案 0 :(得分:0)

啊,编辑后更清楚了。您可以通过让Timer::start()生成一个运行计时器的线程来完成此操作,并在时间用完时设置某种类型的成员,如bool Timer::expired。然后,使用适当的访问者,您的method1可以执行以下操作:

void method1(List l) throws TimeoutException
{
  Timer t;
  t.start();

  while(!l.isEmpty() && !t.isExpired())
  {
    //DO SOMETHING
    ...........
  }

  t.stop();
  if(t.isExpired() && !l.isEmpty())
    throw(TimeoutException(/*...*/));        
}

如果使用增强异步计时器或其他东西有更简单的方法,有人应该说出来。我没有足够的使用提升来对此进行可靠的评论。

编辑:

我在下面评论了我对使用throw损坏数据的担忧。如果您仍然希望在超时时立即强制中断列表处理循环,this page描述了如何使Microsoft将异常从一个线程抛出到另一个线程。跨线程投掷通常会依赖于操作系统,但会尝试以便携方式执行此操作does have some shenanigans。我还没有尝试过这种方法;看起来像异常必须从特定的基类派生,以支持使用boost方法进行传输。