QtScript 和线程

发布于 2024-12-27 05:20:29 字数 445 浏览 1 评论 0原文

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

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

runConcurrentJobs(job1, job2)

这些作业本质上是远程过程调用(ZeroC Ice)的序列,需要在多个点同步。

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

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

  2. 您建议采用什么方法来完成任务?

注释:

  1. 脚本不是由程序员编辑,而是由电气工程师编辑,我希望使脚本尽可能简单和干净。

I want to run several concurrent jobs from QtScript script:

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

runConcurrentJobs(job1, job2)

The jobs a essentially sequences of remote procedure calls (ZeroC Ice), which need to synchronize at several points.

The Qt 4.8.0 documentation says nothing about QScriptEngine thread-safety. My questions:

  1. Is it safe to use single QScriptEngine to exectute QtScript functions from multiple thread concurrently?

  2. What approach would you recommend to accomplish the task?

Notes:

  1. Scripts are edited not by programmers but also by electric engineers and I want to keep the script as simple and clean as possible.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

怀中猫帐中妖 2025-01-03 05:20:29

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

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

  1. 在 C++ 中将 runConcurrentJobs() 实现为 Q_INVOKABLE 函数(或槽)。
  2. 在那里,做类似的事情

     void runConcurrently (const QString &functionname1, QString &functionname2) {
           MyScriptThread 线程1 (函数名1);
           MyScriptThread 线程2 (函数名2);
           线程1.start();
           线程2.start();
           线程1.wait();
           thread2.wait();
           // 可选择从线程中获取返回值并返回它们
       }
    
  3. MyScriptThread 源自 QThread 并实现 QThread::run() 的操作,大致如下:

     void MyScriptThread::run () {
             QScriptEngine引擎;
             引擎.评估(common_script_code);
             结果=engine.evaluate(the_threads_function);
             // the_threads_function 作为 QScriptProgram 或 QString 传递
       }
    

QScriptEngine is documented as "reentrant", meaning, essentially, you can use it multi-threaded, but only one QScriptEngine per thread.

Now, if functions job1() and job2() can be run concurrently at all, in principle, it should be possible to separate them into two distinct QScriptEngines (easy, if neither the functions use local variables, only, more difficult, if globals are involved).

  1. Implement runConcurrentJobs() as a Q_INVOKABLE function (or slot) in C++.
  2. In there, do something like

       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. Where MyScriptThread is derived from QThread and implements QThread::run() roughly like this:

       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
       }
    
恍梦境° 2025-01-03 05:20:29
  1. 一般来说,如果文档没有提及线程,那么它就不是线程安全的。

  2. 我会重写以使用异步请求。把他们俩踢开,然后等他们俩。

  1. In general, if documentation says nothing about threading, it is not thread safe.

  2. I would rewrite to use asynchronous requests. Just kick them both off, then wait for them both.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文