首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Qt: QFuture/QtConcurrent函数调用

Qt: QFuture/QtConcurrent函数调用
EN

Stack Overflow用户
提问于 2013-11-11 09:42:31
回答 4查看 4.1K关注 0票数 1

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

My Problem:,我有我的测试器(gtest),我测试一个函数,它可以以无穷大循环=>结尾,所以我想测试它来解决这个问题(这个函数是内部极值复杂的:-( )。如果存在无穷大循环=>,我想添加一个超时时间,这样我就可以告诉测试人员某些事情不对劲(无穷大循环),并且我将终止线程。

我在寻找这样的东西:

代码语言:javascript
复制
QtConcurrent::run(............,30000 /*30 seconds timeout)*/;

有人知道我如何做到这一点吗?(如果可以使用本机C++,或者boost,或者.你也可以告诉我你的解决方案)

EN

回答 4

Stack Overflow用户

发布于 2013-11-11 10:24:37

我专注于QtConcurrent模块,因为你在你的问题中提到了它。但是,您也可以使用普通的QThread实现您的目标:

代码语言:javascript
复制
// 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来实现这一点。设置您的并发运行,并观察结果与观察者。在事件循环中,用计时器设置Timout,直到完成为止。

代码语言:javascript
复制
// 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...
}
票数 2
EN

Stack Overflow用户

发布于 2015-11-16 12:33:28

问题是,如果没有线程的合作,就无法安全地终止线程。线程可能正在访问某些共享的数据结构,比如C运行时堆,如果它被强制终止,这种数据结构将保持在变化的中期状态,基本上已经损坏。将来从程序中访问它们可能会导致崩溃或更糟。

无限循环的情况与其他坏情况没有任何区别。如果您启动的函数崩溃了程序,您如何向测试人员报告呢?

在您的情况下,您根本不信任正在执行的代码。解决方案是在一个单独的进程中启动它,操作系统保证该进程的安全终止。通过将测试代码与测试程序隔离开来,您可以确保能够检测到所有类型的问题,包括超时或异常终止。

票数 1
EN

Stack Overflow用户

发布于 2013-11-11 10:12:01

我认为你需要找出无限循环发生的原因,而不是试图修复症状。

QtConcurrent::run()使用线程池运行任务。您不能安全地终止线程,因此安全完成任务的唯一方法是从它中return

如果仍然需要超时,可以将类似的内容添加到循环函数中:

代码语言:javascript
复制
QTime t;
t.start();

// it's your loop
while( true ) {

    if( t.elapsed() > 30*1000 ) {
        return 1;
    }
    ...
}
票数 -2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/19903139

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档