2009-09-05 41 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