- C++ - 使用计时器线程启动异常,精度 ms

- C++ - launch exception with a Timer thread , precision ms

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

我想做的是这样的:

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
      }
  }

啊,修改后更清楚了。您可以通过让 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(/*...*/));        
}

如果有更简单的方法使用升压异步计时器或其他东西,应该有人说出来。我没有充分使用 boost 来对此发表可靠的评论。

编辑:

我在下面评论了我对 throw 损坏数据的担忧。如果您仍然真的想在超时时立即强制中断列表处理循环,this page describes how to make Microsoft throw exceptions from one thread to another. Throwing across threads will normally be operating system dependent, but boost does have some shenanigans 尝试以可移植的方式执行此操作。我还没有尝试过那种方法;看起来异常必须从特定的基础派生 class 才能支持使用 boost 方法进行传输。