1

我想从 QtScript 脚本运行几个并发作业:

function job1() { ... }
function job2() { ... }

runConcurrentJobs(job1, job2)

这些作业本质上是一系列远程过程调用(ZeroC Ice),需要在多个点同步。

Qt 4.8.0 文档没有提到QScriptEngine线程安全。我的问题:

  1. QScriptEngine使用单线程同时从多个线程执行 QtScript 函数是否安全?

  2. 你会推荐什么方法来完成这项任务?

笔记:

  1. 脚本不是由程序员编辑,而是由电气工程师编辑,我想让脚本尽可能简单和干净。
4

2 回答 2

1

QScriptEngine被记录为“可重入”,这意味着,本质上,您可以在多线程中使用它,但QScriptEngine每个线程只能使用一个。

现在,如果函数job1()job2()可以同时运行,原则上,应该可以将它们分成两个不同QScriptEngine的 s(如果两个函数都不使用局部变量,则很容易,如果涉及全局变量,则更困难)。

  1. 在 C++ 中实现runConcurrentJobs()Q_INVOKABLE函数(或插槽)。
  2. 在那里,做类似的事情

       void runConcurrently (const QString &functionname1, QString &functionname2) {
           MyScriptThread thread1 (functionname1);
           MyScriptThread thread2 (functionname2);
           thread1.start();
           thread2.start();
           thread1.wait ();
           thread2.wait ();
           // optionally fetch return values from the threads and return them
       }
    
  3. MyScriptThread 派生自 QThread 并实现 QThread::run() 大致如下:

       void MyScriptThread::run () {
             QScriptEngine engine;
             engine.evaluate (common_script_code);
             result = engine.evaluate (the_threads_function);
             // the_threads_function passed as a QScriptProgram or QString
       }
    
于 2014-11-05T21:06:00.453 回答
0
  1. 一般来说,如果文档没有说明线程,它就不是线程安全的。

  2. 我会重写以使用异步请求。把他们俩都踢开,然后等他们俩。

于 2012-01-17T12:24:40.573 回答