如何控制(即中止)QScriptEngine的当前评估

时间:2013-03-29 22:23:23

标签: c++ qt asynchronous future qtconcurrent

我使用QScriptEngine::evaluate(QString code)在我的Qt应用程序中评估JavaScript。假设我评估一个错误的JavaScript片段,它会永远循环(或者等待结果需要很长时间)。我如何中止这样的执行?

我想通过GUI中的两个按钮RunAbort来控制评估。 (但一次只允许执行一次。)

我想通过QtConcurrent::run运行脚本,保留QFuture并在按下Abort时调用cancel()。但是文件说我不能中止这样的处决。似乎QFuture仅在处理作业中的当前项目之后取消,即在缩小或过滤集合时。但对于QtConcurrent::run,这意味着我不能使用未来中止其执行。

我提出的另一种可能性是使用QThread并调用quit(),但我遇到了类似的问题:只有在事件等待的情况下才会取消线程环。但由于我的执行是一个单一的函数调用,所以这也没有选择。

QThread也有terminate(),但文档让我有点担心。虽然我的代码本身不涉及互斥体,但幕后可能会QScriptEngine::evaluate吗?

  

警告:此功能很危险,不鼓励使用。线程可以在其代码路径中的任何位置终止。修改数据时可以终止线程。线程无法自行清理,解锁任何保持的互斥锁等。简而言之,只有在绝对必要时才使用此功能。

我还缺少另一种选择,可能是一些异步评估功能吗?

2 个答案:

答案 0 :(得分:1)

答案 1 :(得分:0)

虽然并发任务本身不能“从外部”中止,但是QScriptEngine可以被告知(当然是从另一个线程,比如你的GUI线程)中止执行:

QScriptEngine::abortEvaluation(const QScriptValue & result = QScriptValue())

可选参数用作“伪结果”,传递给evaluate()的调用者。

您应该在某处设置标志或在abortEvaluation()中使用特殊结果值,以使调用程序例程能够检测到执行被中止。

注意:使用isEvaluating(),您可以查看评估当前是否正在运行。