QtScript和线程

时间:2012-01-17 11:08:02

标签: c++ multithreading qt qtscript

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

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

runConcurrentJobs(job1, job2)

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

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

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

  2. 您建议采用什么方法来完成任务?

  3. 备注:

    1. 脚本不是由程序员编辑,也是由电气工程师编辑的,我希望尽可能保持脚本的简单和清洁。

2 个答案:

答案 0 :(得分:0)

  1. 一般来说,如果文档没有提及线程,那么它就不是线程安全的。

  2. 我会重写使用异步请求。把它们踢掉,然后等待它们。

答案 1 :(得分:0)

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

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

  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
       }