QtScript и потоки - PullRequest
       30

QtScript и потоки

1 голос
/ 17 января 2012

Я хочу запустить несколько параллельных заданий из скрипта QtScript:

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

runConcurrentJobs(job1, job2)

Задания представляют собой по существу последовательности удаленных вызовов процедур (ZeroC Ice), которые необходимо синхронизировать в нескольких точках.

Документация Qt 4.8.0 ничего не говорит о QScriptEngine поточной безопасности. Мои вопросы:

  1. Безопасно ли использовать один QScriptEngine для одновременного извлечения функций QtScript из нескольких потоков?

  2. Какой подход вы бы порекомендовали для выполнения задачи?

Примечания:

  1. Скрипты редактируются не программистами, а инженерами-электриками, и я хочу сделать скрипт максимально простым и чистым.

Ответы [ 2 ]

0 голосов
/ 06 ноября 2014

QScriptEngine задокументировано как «входящий», то есть, по сути, вы можете использовать его как многопоточный, но только один QScriptEngine на поток.

Теперь, если функции job1() и job2() могут вообще выполняться одновременно, в принципе, должно быть возможно разделить их на два отдельных QScriptEngine (легко, если ни одна из функций не использует локальные переменные, только , сложнее, если задействованы глобалы).

  1. Реализация runConcurrentJobs() как функции (или слота) Q_INVOKABLE в C ++.
  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
       }
    
0 голосов
/ 17 января 2012
  1. Как правило, если в документации ничего не говорится о многопоточности, она не безопасна для потоков.

  2. Я бы переписал использовать асинхронные запросы. Просто отбросьте их обоих, а затем ждите их обоих.

...