【问题标题】:Architecture for Qt application with Lua scripting - pause execution带有 Lua 脚本的 Qt 应用程序架构 - 暂停执行
【发布时间】:2010-11-25 20:06:36
【问题描述】:

我的嵌入式项目包含一个用于 PC 的 Qt 应用程序,它主要是一个用于调试和测试的模拟器。在应用程序中,我可以创建几个小部件,它们代表我的嵌入式软件或模拟由应用程序控制的硬件,或者可以生成用于测试的外部输入。

我计划通过添加 Lua 脚本来改进应用程序,以便可以从脚本创建或控制小部件。我需要一种优雅的方式来单步执行脚本。 我计划的脚本如下:

createThermometerWidget(10,20,30)
while time < maxTime do
  setTemperature(20+time/1000)
  pauseSimulation()
  time = time + 1
end

自定义函数pauseSimulation 应该停止 Lua 脚本,启用 Qt 事件循环以便与软件交互(例如设置其他输入),并且在按下按钮后脚本将继续。

我的第一个想法是为 Lua 执行创建一个单独的线程,该线程将由 pauseSimulation 停止并由按钮释放。但是不能从非主线程创建 Qt 小部件,因此我必须在主线程中创建所有小部件并将所有构造函数参数从 Lua 函数传递到主线程。

有没有更流畅的方法?

【问题讨论】:

    标签: c++ qt scripting lua


    【解决方案1】:

    Coroutines 是实现这一点的一种方法。您的pauseSimulation() 可以在内部调用coroutine.yield(),稍后通过按钮操作调用coroutine.resume() 重新启动。问题是您的 UI 受脚本片段的支配,因为停止正在运行的协程的唯一方法是让它最终调用 yield()

    或者,您可以使用Lanes 模块将部分 Lua 应用程序放入单独的线程中。您将使用 Linda 将消息从主 Qt 小部件线程传递到模拟器的工作线程。这样做的好处是 UI 线程不会被在其自己的线程中运行的模拟阻塞。

    【讨论】:

    • Qt 有不错的多线程支持。您可以使用 QThreads 而不是 Lanes 来将 lua 与 Qt 的 GUI 同步。 Lua 的线程将在一个循环中工作,该循环只接收来自 GUI 的消息并恢复不同的协程。少一个需要担心的外部库。
    • 我唯一担心的是 Lua 本身不一定是线程安全的或线程感知的。在每个线程中保留一个单独的 Lua 状态是安全的,但该状态只能从该线程内访问。如果 Qt 绑定到 Lua 可以轻松实现,那么这是一个很好的解决方案。 Lanes 在操作系统线程之间提供安全同步的数据传输,解决了一些问题。
    猜你喜欢
    • 1970-01-01
    • 2015-03-05
    • 1970-01-01
    • 1970-01-01
    • 2014-01-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-04
    相关资源
    最近更新 更多