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

C++ 带有Lua脚本的Qt应用程序体系结构-暂停执行,c++,qt,scripting,lua,C++,Qt,Scripting,Lua,我的嵌入式项目包含一个用于PC的Qt应用程序,它主要是一个用于调试和测试的模拟器。在应用程序中,我可以创建几个小部件,它们表示我的嵌入式软件或模拟由应用程序控制的硬件,或者可以生成用于测试的外部输入 我计划通过添加Lua脚本来改进应用程序,以便可以通过脚本创建或控制小部件。我需要一个优雅的方式单步脚本。 我计划的脚本如下: createThermometerWidget(10,20,30) while time < maxTime do setTemperature(20+time/1

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

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

createThermometerWidget(10,20,30)
while time < maxTime do
  setTemperature(20+time/1000)
  pauseSimulation()
  time = time + 1
end
createThermometerWidget(10,20,30)
当时间
自定义功能
pauseSimulation
应停止Lua脚本,启用Qt事件循环运行,以便与软件进行交互(例如设置其他输入),按下按钮后脚本将继续

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

有没有更顺畅的办法

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


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

Qt具有良好的多线程支持。可以使用QThreads而不是Lanes将lua与Qt的GUI同步。Lua的线程将在一个循环中工作,该循环只接收来自GUI的消息并恢复不同的协程。少了一个需要担心的外部库。我唯一担心的是Lua本身不一定是线程安全的或线程感知的。在每个线程中保持一个单独的Lua状态是安全的,但该状态只能从该线程中访问。如果Qt与Lua的绑定使得这很容易实现,那么这是一个很好的解决方案。Lanes提供了操作系统线程之间的安全同步数据传输,解决了其中一些问题。