2012-01-17 95 views
1

我想从运行脚本QtScript几个兼职:QtScript和线程

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

runConcurrentJobs(job1, job2) 

的工作远程过程调用(ZeroC ICE),这就需要在几个点同步的基本序列。

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

  1. 是否可以安全使用单QScriptEngine从多个线程exectute QtScript功能同时?

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

注:

  1. 脚本进行编辑不是由程序员也由电力工程师,我想保持脚本简单干净越好。
+0

什么远程过程的类型打电话你在用吗? AJAX? d总线? – Ben 2012-01-17 12:18:36

+0

@Ben:It's ZeroC Ice – Begemoth 2012-01-17 13:09:22

回答

0
  1. 在一般情况下,如果文件没有提到线程,它不是线程安全的。

  2. 我会重写使用异步请求。把他们都踢出去,然后等他们两个。

+0

使用异步API不是一个解决方案:脚本不是由程序员编辑,而是由电气工程师编辑,我希望脚本尽可能简单和干净。我不认为交错的异步调用可以调用干净的代码。我会尝试编写一个combinator库来模拟我想要的外观和感觉。 – Begemoth 2012-01-17 13:28:52

+0

最简单的解决方案是教工程师编写异步调用。 – Ben 2012-01-17 15:05:14

0

QScriptEngine记录为“重入”的含义,本质上,你可以用它的多线程,但是每个线程只有一个QScriptEngine

现在,如果功能job1()job2()可以同时在所有运行,原则上,应该可以将它们分成两个不同的QScriptEngine S(容易,如果既没有功能使用局部变量,只有更困难的,如果全局参与)。

  1. 实施runConcurrentJobs()如在C 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 
        }