gpt4 book ai didi

c++ - 停止 Qt 脚本的评估

转载 作者:太空狗 更新时间:2023-10-29 23:04:55 25 4
gpt4 key购买 nike

我最近在模拟器上添加了一个脚本函数。我在 GUI 上添加了一个“启动脚本”按钮,可以启动脚本的评估。

我的 main 创建了一个 QThread (scriptThread) 来评估我的脚本。我的 QMainWindows 向调用 scriptThread 槽的 main 发送信号。

我希望能够在需要时从 GUI 启动和停止脚本。我首先调用了 scriptThread 的 terminate() 槽。但它破坏了我的 Qthread,取消后我无法重新启动脚本(因为我已经在我的 main 开始时创建了我的 scriptThread)。

这是我主要的一部分:

MyGUI w();
ScriptThread scriptThread();

QObject::connect(&w, SIGNAL(setScriptPath(QString)),
&scriptThread, SLOT(setPath(QString)));
QObject::connect(&w, SIGNAL(launchScriptSignal()),
&scriptThread, SLOT(start()));
QObject::connect(&w, SIGNAL(stopScript()),
&scriptThread, SLOT(terminate()));

QObject::connect(&scriptThread, SIGNAL(finished()),
&w, SLOT(scriptFinished()));

这是我的 scriptThread 中的 run() 函数:

QScriptEngine m_scriptEngine;
QScriptValue m_result;

QScriptValue m_scriptValue = m_scriptEngine.newQObject(m_MyQOBJECT);

m_scriptEngine.globalObject().setProperty("sc", m_scriptValue);

QFile file(m_path);
bool result = file.open(QIODevice::ReadOnly);

if(!result)
{
printf("Script path not found.\n");
emit finished();
return;
}

m_result = m_scriptEngine.evaluate(file.readAll());

if(m_result.toString() != "undefined")
std::cout << m_result.toString().toStdString() << std::endl;

file.close();

if(m_scriptEngine.hasUncaughtException())
{
int lineNo = m_scriptEngine.uncaughtExceptionLineNumber();
printf("lineNo : %i\n", lineNo);
}

printf("ScriptThread finished\n");
emit finished();

GUI 有趣的功能:

void myGUI::launchScript(QString path)
{
if(!m_isScriptRunning)
{
path = ui->editScriptPath->text();
disableAll();

ui->Script->setText("stop script");
m_isScriptRunning = true ;

emit setScriptPath(path);
emit launchScriptSignal();
}
else
{
emit stopScript();
scriptFinished();
}
}

void MyGUI::scriptFinished()
{
enableAll();

ui->Script->setText("launch script");
m_isScriptRunning = false ;
}

所以我的问题是,如何在不破坏线程的情况下取消对脚本的评估?我试过 quit() 插槽,但它仅适用于事件循环。是否有现有的插槽或小技巧可以做到这一点?

谢谢。

最佳答案

abortEvaluation() 不适用于 QScriptValue::call(),也不适用于从 C++ 代码到 javascript 的调用。要中断这些,您可以抛出异常。这对我有用,我把它放在这里,这样其他人就不必花时间寻找它了:

if(engine->isEvaluating())
{
engine->abortEvaluation();
}
else
{
QScriptContext *ctx = engine->currentContext();
if(ctx)
ctx->throwError("Code has been executing for too long!");
}

当然,脚本可以捕获此异常并继续,但很有可能不会,即使捕获了,也很可能会跳出无限循环。

关于c++ - 停止 Qt 脚本的评估,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20991493/

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