代码之家  ›  专栏  ›  技术社区  ›  danatel

带有Lua脚本的Qt应用程序体系结构-暂停执行

  •  2
  • danatel  · 技术社区  · 15 年前

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

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

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

    自定义函数 pauseSimulation 如果停止lua脚本,则启用qt事件循环以运行,以便与软件进行交互(例如设置其他输入),按下按钮后,脚本将继续。

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

    有更顺畅的方法吗?

    1 回复  |  直到 15 年前
        1
  •  3
  •   RBerteig Keith Adler    15 年前

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

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