我需要一个计时器,在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
}
}
答案 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方法进行传输。