【问题标题】:Run two Lua-functions from Qt/C++-App parallel从 Qt/C++-App 并行运行两个 Lua 函数
【发布时间】:2018-11-25 10:07:44
【问题描述】:

我有一个用 C++ 编写的 Qt 应用程序。它是用于测试硬件的通用工具。 具体的测试在 lua 脚本中定义。

在我的脚本中,我有一个名为“RunTests()”的函数,它在 Qt 应用程序的 QThread 中调用。我将它放入 QThread 以防止脚本冻结我的应用程序。 现在 lua 脚本中有另一个函数,称为“Interrupt()”,在测试期间有时应该由 Qt 应用程序调用。 所以现在每次我用 lua_getglobal() 调用这个函数 'Interrupt()' 我的 Qt-Application 都会崩溃。

如何同时运行这 2 个 Lua 函数,或者如何中断 'RunTests()' 以调用 'Interrupt()' 然后返回到 'RunTests()'?

【问题讨论】:

    标签: c++ multithreading qt lua


    【解决方案1】:

    您不能在相同的 Lua 状态下运行并发脚本。

    您可以在不同的 Lua 状态下运行并发脚本。

    【讨论】:

    • 叮叮叮!就是这样。不过,有一些方法可以安全地在 lua 状态之间共享数据,因此存在大量 lua 状态这一事实并不意味着脚本需要完全隔离。
    • 感谢您的回答。所以这意味着我可以在两种不同的 Lua 状态中加载我的脚本,一种运行我的 RunTest() 函数,另一种运行我所谓的“中断”函数?
    【解决方案2】:

    您的问题归结为“如何中断线程?”。这是一个常见问题,答案通常是您不能,但还有其他方法。您不能这样做的简单原因是线程可能处于修改全局状态的某些操作的中间,例如堆分配。如果你在中间杀死它,它会使数据结构暂时处于无效状态,并使互斥锁处于锁定状态。

    想到两种可能对您有用的方法:

    • 您可以要求线程退出。如果您的线程定期检查标志(可能是导出到 Lua 的 C++ 函数中的变量)然后做出相应反应,您可以设置标志并等待线程完成。
    • 另一种常见的方法是不使用线程,而是使用进程。除了线程,一个进程可以被终止并且操作系统保证正确的清理。缺点是进程不共享状态,因此您必须设置某种 IPC。
    • 第三种方法也可能有效,但这取决于您使用的系统。在 POSIX 系统上,您可以使用信号来触发线程终止。但是,为此,它必须得到代码的适当支持。如果 Lua 不支持它,那么你很不走运,并且可能在其他操作系统上也是如此。

    【讨论】:

      【解决方案3】:

      我现在通过使用协程解决了这个问题。

      所以当我的两个功能是:

      function DataHandler(data)
          buffer = buffer .. data
          ...
      end
      
      function Tests()
          ...
      end
      

      我添加了以下代码行:

      co_DataHandler = coroutine.create(DataHandler)
      co_Tests = coroutine.create(Tests)
      

      有了这个,我可以在同一个 QThread 中运行 DataHandler() 而 Tests() 正在做一些其他的事情。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2022-09-23
        相关资源
        最近更新 更多