我使用QScriptEngine::evaluate(QString code)
在我的Qt应用程序中评估JavaScript。假设我评估一个错误的JavaScript片段,它会永远循环(或者等待结果需要很长时间)。我如何中止这样的执行?
我想通过GUI中的两个按钮Run
和Abort
来控制评估。 (但一次只允许执行一次。)
我想通过QtConcurrent::run
运行脚本,保留QFuture
并在按下Abort
时调用cancel()
。但是文件说我不能中止这样的处决。似乎QFuture
仅在处理作业中的当前项目之后取消,即在缩小或过滤集合时。但对于QtConcurrent::run
,这意味着我不能使用未来中止其执行。
我提出的另一种可能性是使用QThread
并调用quit()
,但我遇到了类似的问题:只有在事件等待的情况下才会取消线程环。但由于我的执行是一个单一的函数调用,所以这也没有选择。
QThread
也有terminate()
,但文档让我有点担心。虽然我的代码本身不涉及互斥体,但幕后可能会QScriptEngine::evaluate
吗?
警告:此功能很危险,不鼓励使用。线程可以在其代码路径中的任何位置终止。修改数据时可以终止线程。线程无法自行清理,解锁任何保持的互斥锁等。简而言之,只有在绝对必要时才使用此功能。
我还缺少另一种选择,可能是一些异步评估功能吗?
答案 0 :(得分:1)
http://doc.qt.io/qt-4.8/qscriptengine.html#details
它有几个部分可以解决您的问题:
http://doc.qt.io/qt-4.8/qscriptengine.html#long-running-scripts
http://doc.qt.io/qt-4.8/qscriptengine.html#script-exceptions
http://doc.qt.io/qt-4.8/qscriptengine.html#abortEvaluation
http://doc.qt.io/qt-4.8/qscriptengine.html#setProcessEventsInterval
希望有所帮助。
答案 1 :(得分:0)
虽然并发任务本身不能“从外部”中止,但是QScriptEngine
可以被告知(当然是从另一个线程,比如你的GUI线程)中止执行:
QScriptEngine::abortEvaluation(const QScriptValue & result = QScriptValue())
可选参数用作“伪结果”,传递给evaluate()
的调用者。
您应该在某处设置标志或在abortEvaluation()
中使用特殊结果值,以使调用程序例程能够检测到执行被中止。
注意:使用isEvaluating()
,您可以查看评估当前是否正在运行。