2009-09-05 42 views
2

我的嵌入式项目包含一个用于PC的Qt应用程序,主要是用于调试和测试的模拟器。在应用程序中,我可以创建多个小部件,代表我的嵌入式软件或模拟由应用程序控制的硬件,或者可以生成用于测试的外部输入。使用Lua脚本编写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函数传递到主线程。

有没有更流畅的方法?

回答

3

Coroutines是实现此目的的一种方法。您的pauseSimulation()可以在内部呼叫coroutine.yield(),稍后通过按钮的操作调用coroutine.resume()重新启动。问题在于你的用户界面受制于你的脚本片段,因为停止正在运行的协程的唯一方法是事件调用yield()

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

+0

非常感谢。 – danatel 2009-09-05 18:12:08

+1

Qt有不错的多线程支持。你可以使用QThreads而不是Lanes来同步lua和Qt的GUI。 Lua的线程可以在只接收来自GUI的消息并恢复不同协程的循环中工作。少一个外部图书馆担心。 – 2009-09-08 18:01:37

+0

我唯一担心的是Lua本身不一定是线程安全的或线程感知的。在每个线程中保持单独的Lua状态是安全的,但只能从该线程内访问该状态。如果Qt绑定到Lua可以很容易实现,那么这是一个很好的解决方案。通道提供了OS线程之间安全同步的数据传输,解决了一些问题。 – RBerteig 2009-09-08 23:52:16