- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我需要一个超时函数调用。我主要使用 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 中使用 QFutureWatcher
、QTimer
和助手 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/
我有一个函数返回 QFuture 对象作为 QtConcurrent::run 计算的结果。但是,在运行并发方法之前可能存在某些情况,我需要从我的函数中手动返回一个持有值(value)的 future
我遇到了QtConcurrent 的一个很奇怪的问题。 ,主要是因为奇怪的编程欲望,也许这只是一个XY问题,但是...... 所以,有我的代码,试图与数据库通信,实际上是一个后端代码(在 Qt 上,是
我可以将另一个 QFuture 对象分配给已经运行的 QFuture 对象吗?就像下面的例子: QFuture future = QtConcurrent::run(function); futu
我正在使用 Qt 进行黑莓 10 开发。我正在使用 QFuture,QtConcurent::run。所以这是我的代码: applicationui.cpp LoadData* Data = new
我正在尝试使用 QT 的 QFuture 和 QFutureWatcher 来实现带有通知的工作线程,但是通知没有在正确的时间出现! 我正在从菜单处理程序调用 loadFile(QString),并期
我在QTConcurrent::run中使用QFuture 在后台线程中运行一些代码。我想从主线程中检测此后台代码中的异常。 根据Notification about exceptions in Qt
我目前正在开发一个编辑器程序;我需要编写一个功能,它需要使用项目的异步文件 API 连续加载多个文件,然后在加载这些文件后执行更多计算。 在另一种语言中,这可能会通过 async/await 工作流来
我有以下有效的代码(但它不应该有效) void myfunction(){ auto future = function_which_return_future(); auto *watche
我正在编写一个使用 QtConcurrent 的程序启动线程。在我的例子中,当我使用鼠标滚动时,我用它来渲染 QGraphicsView。 我正在使用以下代码启动线程: if (future.isRu
我需要一个超时函数调用。我主要使用 Qt(4.7.3、4.8.5)工作,所以我试图找到 Qt 的解决方案。 QFuture 和 QtConcurrent 这两个类似乎完成了我需要的 99%,但我找不到
我试图让我的应用程序在多个线程上运行,以提高其进程的效率。我在 Qt 的网站上找到了 QFuture可以帮助我的模板类。我试图在他们的一个例子中使用 like 。以下是我的类声明/定义的一部分。 cl
我有一个带有 QThread 的程序,其中包含一个网络客户端。客户端应该获取一个对象,对其进行处理,将其上传到服务器,获取响应,然后向主线程报告。我用 std::promise 做到了这一点,并使用了
主 GUI 线程在等待 QFuture 时更新 QProgressDialog 的正确方法是什么。具体来说,这个循环中发生了什么: QProgressDialog pd(...); QFuture f
void QFutureWatcher::resultReadyAt(int index) 当观察到的 future 在 index 报告准备好的结果时,会发出此信号。如果 future 报告了多个结
所以我发现我的 UI 程序出现了一些问题,因为我没有使用线程。 我看了一下,从我在文档中看到的 QFuture 似乎是我需要的,我认为当你有一个函数并且你只想在线程中运行它时使用它是正确的吗? 是的,
所以我已经使用 QtConcurrent::run 一段时间了,它很棒。但是现在我需要函数来返回一个对象。因此我使用伪代码 QFutureWatcher fw; QFuture t1 = QtConc
Qt 是否提供与Concurrency::event 行为方式大致相同的同步原语?来自 Microsoft 的并发运行时? 具体来说,我希望线程 A 中的 wait() 返回,即使它在线程 B 已经调
我是一名优秀的程序员,十分优秀!