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スレッドごとに 1 つしか使用できません。

ここで、関数job1()job2()を同時に実行できる場合、原則として、それらを 2 つの別個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
       }
    
于 2014-11-05T21:06:00.453 に答える
0
  1. 一般に、ドキュメンテーションにスレッド化について何も書かれていない場合、それはスレッドセーフではありません。

  2. 非同期リクエストを使用するように書き直します。両方をキックオフしてから、両方を待ちます。

于 2012-01-17T12:24:40.573 に答える