2009-09-05 2 views
2

내 임베디드 프로젝트에는 주로 디버깅 및 테스트 용 시뮬레이터 인 PC 용 Qt 애플리케이션이 포함되어 있습니다. 응용 프로그램에서 내 임베디드 소프트웨어를 나타내는 여러 위젯을 만들거나 응용 프로그램이 제어하는 ​​하드웨어를 시뮬레이트하거나 테스트 용 외부 입력을 생성 할 수 있습니다.루아 스크립팅을 통한 Qt 애플리케이션 아키텍처 - 실행 일시 중지

위젯을 스크립트에서 만들거나 제어 할 수 있도록 Lua 스크립팅을 추가하여 응용 프로그램을 향상시킬 계획입니다. 스크립트를 한 단계 씩 실행하는 데 우아한 방법이 필요합니다. 내가 좋아하는 스크립트를 계획 :

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

기능 pauseSimulation가, 루아 스크립트를 중지 할 수 있습니다 (예를 들어, 다른 입력 최저치를)되어 있으므로 소프트웨어와 그 상호 작용을 실행하기 위해 Qt는 이벤트 루프를 활성화하고 버튼을 누른 후해야하는 사용자 정의 스크립트는 계속됩니다.

첫 번째 아이디어는 버튼으로 풀어 놓은 pauseSimulation에 의해 중지 될 루아 실행을위한 별도의 스레드를 만드는 것이 었습니다. 그러나 Qt 위젯은 메인이 아닌 스레드에서 생성 될 수 없으므로 메인 스레드에서 모든 위젯을 생성하고 모든 생성자 매개 변수를 루아 함수에서 메인 스레드로 전달해야합니다.

더 부드러운 방법이 있습니까?

답변

3

Coroutines은이를 구현하는 한 가지 방법입니다. pauseSimulation()은 내부적으로 coroutine.yield()으로 전화 할 수 있으며 나중에 버튼 동작으로 coroutine.resume()으로 호출하여 다시 시작할 수 있습니다. 문제는 실행중인 코 루틴을 중단하는 유일한 방법은 궁극적으로 yield()을 호출하기 때문에 UI가 스크립트 조각을 사용한다는 것입니다.

또는 Lanes 모듈을 사용하여 Lua 응용 프로그램의 일부를 별도의 스레드에 넣을 수 있습니다. 메인 Qt 위젯 스레드의 메시지를 시뮬레이터의 작업자 스레드로 전달하기 위해 Linda를 사용할 것입니다. 이렇게하면 UI 스레드가 자체 스레드에서 실행되는 시뮬레이션에 의해 차단되지 않는다는 이점이 있습니다.

+0

대단히 감사합니다. – danatel

+1

Qt는 멀티 스레딩을 지원합니다. Qt의 GUI와 lua를 동기화하기 위해 레인보다는 QThread를 사용할 수 있습니다. 루아의 스레드는 GUI에서 메시지를 수신하고 다른 루틴을 다시 시작하는 루프에서 작동합니다. 걱정할 외부 라이브러리가 하나 줄어 듭니다. –

+0

내 관심사는 루아 그 자체가 꼭 쓰레드 안전하거나 쓰레드를 인식하지 않는다는 것입니다. 각 스레드마다 별도의 Lua 상태를 유지하는 것이 안전하지만 그 상태는 해당 스레드 내에서만 액세스해야합니다. 루아에 대한 Qt 바인딩을 통해 쉽게 달성 할 수 있다면 좋은 해결책입니다. 레인은 OS 스레드간에 안전하게 동기화 된 데이터 전송을 제공하여 해당 우려 사항 중 일부를 해결합니다. – RBerteig