내 임베디드 프로젝트에는 주로 디버깅 및 테스트 용 시뮬레이터 인 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 위젯은 메인이 아닌 스레드에서 생성 될 수 없으므로 메인 스레드에서 모든 위젯을 생성하고 모든 생성자 매개 변수를 루아 함수에서 메인 스레드로 전달해야합니다.
더 부드러운 방법이 있습니까?
대단히 감사합니다. – danatel
Qt는 멀티 스레딩을 지원합니다. Qt의 GUI와 lua를 동기화하기 위해 레인보다는 QThread를 사용할 수 있습니다. 루아의 스레드는 GUI에서 메시지를 수신하고 다른 루틴을 다시 시작하는 루프에서 작동합니다. 걱정할 외부 라이브러리가 하나 줄어 듭니다. –
내 관심사는 루아 그 자체가 꼭 쓰레드 안전하거나 쓰레드를 인식하지 않는다는 것입니다. 각 스레드마다 별도의 Lua 상태를 유지하는 것이 안전하지만 그 상태는 해당 스레드 내에서만 액세스해야합니다. 루아에 대한 Qt 바인딩을 통해 쉽게 달성 할 수 있다면 좋은 해결책입니다. 레인은 OS 스레드간에 안전하게 동기화 된 데이터 전송을 제공하여 해당 우려 사항 중 일부를 해결합니다. – RBerteig