我的问题与以下问题完全一致。
break the function after certain time
但是,上述问题围绕Python实现。我试图在C ++中实现相同的东西。这是代码:
#include <signal.h>
#include <stdio.h>
#include <stdbool.h>
#include <unistd.h>
#include <stdexcept>
void handle_alarm( int sig ) {
printf("%d",sig);
throw std::invalid_argument("none");
}
int main() {
for (int i=0; i<10; i++){
signal( SIGALRM, handle_alarm );
printf("Doing normal work %d \n",i);
alarm(120);
try {
for (;;){} // It will be replaced by a function which can take very long time to evaluate.
}
catch(std::invalid_argument& e ) {
continue;
}
}
}
问题陈述
:对于循环的每次迭代,将调用一个函数XYZ(可能需要很长时间的评估)(在上面的代码中用无限for循环代替)。我的目标是终止函数的执行,如果它需要超过2分钟,并继续下一次迭代。
然而,这给了我错误terminate called after throwing an instance of 'std::invalid_argument'
。我也曾尝试使用自定义异常类,但错误仍然存在。
我无法弄清楚这个具体实现有什么问题,或者是否存在其他更好的方法?任何帮助将非常感激。
答案 0 :(得分:1)
解决问题的一种方法是将std::async
与async
launch policy一起使用。
然后,您可以使用返回的wait_for
的std::future
仅在特定时间内等待结果。
如果你没有在时间范围内得到结果,那么保存未来(它不能是destructed,直到它有结果!)但是忽略它及其可能的结果。
这不会真正“破坏”这个功能,它会一直持续到完成。但无论如何,这是继续你的计划的一种方式。