我专注于 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 执行此操作,使用 a QFutureWatcher
、 aQTimer
和 helper QEventLoop
。设置您的并发运行,并使用观察者观察结果。使用计时器设置超时,并在事件循环中等待任何一个完成。
// 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...
}