2012-01-17 16 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 
        }