我需要一个超时函数调用。我主要使用Qt (4.7.3,4.8.5),所以我试图用Qt找到一个解决方案。QFuture和QtConcurrent这两个类似乎完成了我所需的99%的任务,但我找不到超时函数调用的可能性。
My Problem:,我有我的测试器(gtest),我测试一个函数,它可以以无穷大循环=>结尾,所以我想测试它来解决这个问题(这个函数是内部极值复杂的:-( )。如果存在无穷大循环=>,我想添加一个超时时间,这样我就可以告诉测试人员某些事情不对劲(无穷大循环),并且我将终止线程。
我在寻找这样的东西:
QtConcurrent::run(............,30000 /*30 seconds timeout)*/;有人知道我如何做到这一点吗?(如果可以使用本机C++,或者boost,或者.你也可以告诉我你的解决方案)
发布于 2013-11-11 10:24:37
我专注于QtConcurrent模块,因为你在你的问题中提到了它。但是,您也可以使用普通的QThread实现您的目标:
// A Thread calling your test function
class MyThread : public QThread {
protected:
void run() { myFunction(); }
};
// calling the function
MyThread t;
t.start();
if ( t.wait(30000) ) {
// Finished
} else {
// Not finished
// ATTENTION: USE TERMINATE WITH CARE (see QThread documentation)!
t.terminate();
}终止调用将强制停止线程,从而停止函数的执行。但是,请注意,线程无法清除,而且函数使用的任何资源都没有被正确释放。
旧答案:
您可以使用Qt,使用QFutureWatcher、QTimer和助手QEventLoop来实现这一点。设置您的并发运行,并观察结果与观察者。在事件循环中,用计时器设置Timout,直到完成为止。
// Setup eventloop, watcher and timer
QEventLoop loop;
QFutureWatcher watcher;
QObject::connect( &watcher, SIGNAL(finished()), &loop, SLOT(quit()));
QTimer::singleShot( 30000, &loop, SLOT(quit()) );
// Start function call
QFuture<T> future = QtConcurrent::run(...);
// Watch the call
watcher.setFuture( future );
// Wait until event loop finishes
loop.exec();
// Now either future has finished, or timeout was reached...
if ( future.isFinished() ) {
// Function completed!
} else {
future.cancel();
// Infinite loop...
}发布于 2015-11-16 12:33:28
问题是,如果没有线程的合作,就无法安全地终止线程。线程可能正在访问某些共享的数据结构,比如C运行时堆,如果它被强制终止,这种数据结构将保持在变化的中期状态,基本上已经损坏。将来从程序中访问它们可能会导致崩溃或更糟。
无限循环的情况与其他坏情况没有任何区别。如果您启动的函数崩溃了程序,您如何向测试人员报告呢?
在您的情况下,您根本不信任正在执行的代码。解决方案是在一个单独的进程中启动它,操作系统保证该进程的安全终止。通过将测试代码与测试程序隔离开来,您可以确保能够检测到所有类型的问题,包括超时或异常终止。
发布于 2013-11-11 10:12:01
我认为你需要找出无限循环发生的原因,而不是试图修复症状。
QtConcurrent::run()使用线程池运行任务。您不能安全地终止线程,因此安全完成任务的唯一方法是从它中return。
如果仍然需要超时,可以将类似的内容添加到循环函数中:
QTime t;
t.start();
// it's your loop
while( true ) {
if( t.elapsed() > 30*1000 ) {
return 1;
}
...
}https://stackoverflow.com/questions/19903139
复制相似问题