c++ - QtScript 和线程

标签 c++ multithreading qt qtscript

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

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

runConcurrentJobs(job1, job2)

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

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

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

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

注意事项:

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

最佳答案

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

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

  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
       }
    

关于c++ - QtScript 和线程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8893571/

相关文章:

c++ - 继承带有默认参数的构造函数?

c++ - 为什么右值对象允许被编译器修改?

c - 使用 pthread 分割和搜索数组段时出现问题

java - 在 Java 中,每个线程可能是 Singleton 吗?

c# - 在 C# 中获取线程的内存统计信息

c++ - 设置16位灰度QImage的像素值

c++ - 模板元编程 : Sum of 1 to n

c++ - 将 "extractor"传递给也采用可迭代对象的 C++ 方法

c++ - QT和QGLViewer程序中如何改变QGLViewer默认的远近裁剪距离?

C++ Qt QFileSystemWatcher 文件上传双