gpt4 book ai didi

c++ - Qt:QFuture/QtConcurrent超时函数调用

转载 作者:太空宇宙 更新时间:2023-11-04 14:33:43 25 4
gpt4 key购买 nike

我需要一个超时函数调用。我主要使用 Qt(4.7.3、4.8.5)工作,所以我试图找到 Qt 的解决方案。 QFuture 和 QtConcurrent 这两个类似乎完成了我需要的 99%,但我找不到使函数调用超时的可能性。

我的问题:我有我的测试仪 (gtest),我测试了一个可以在无限循环中结束的函数 => 所以我想测试它来解决那个问题 [s](这个函数是内部极端复杂的 :-( )。我想添加如果存在无限循环,则超时时间会中断 => 这样我就可以告诉测试人员出了什么问题(无限循环),我将终止该线程。

我在搜索类似的东西:

QtConcurrent::run(............,30000 /*30 seconds timeout)*/;

有人知道我该怎么做吗?(如果可以使用原生 C++,或者 boost,或者......你也可以告诉我你的解决方案)

最佳答案

我专注于 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 中使用 QFutureWatcherQTimer 和助手 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...
}

关于c++ - Qt:QFuture/QtConcurrent超时函数调用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19903139/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com