문제

C/C ++ 프로그램에서 LUA 코드를 표준 "LUA_PCALL"기능 호출보다 더 세밀한 레벨로 실행하는 방법이 있습니까? 이상적으로는 저수준 바이트 코드 지침 목록 (그러한 것들이 있다고 가정)을 하나씩 실행할 수 있기를 원합니다. 처음부터 끝까지 완전한 LUA 기능.

제가이 작업을 원하는 이유는 LUA 코드가 호출 할 수있는 C 함수를 구현하고 싶기 때문에 프로그램이 계속 실행되기 전에 특정 (잠재적으로 오래 지속되는) 작업이 완료 될 때까지 기다릴 수 있기 때문입니다. 일반적인 LUA 스크립트에는 이러한 기능 호출의 비율이 높기 때문에 작업이 완료되면 콜백을 사용하도록 다시 작성하는 아이디어는 실제로 실용적이지 않습니다.

도움이 되었습니까?

해결책

어쩌면 질문을 밟지 만, 일부 이벤트가 발생할 때까지 대기하기 위해 사용자 정의 C 제품 대신 Lua Coroutines를 사용할 수 있습니다.

예를 들어, 하나의 코 루틴은 waitforevent () 함수를 호출 할 수 있습니다. 거기에서 해당 이벤트가 발생할 때까지 다른 코로로 전환 한 다음 첫 번째 이벤트를 재개 할 수 있습니다. 보세요 루아 코로 문서 그것에 대해 자세히 알아보십시오.

다른 팁

LUA의 협력 스레딩 (명시 적 수율) 기능을 사용하여 긴 대기 C 루틴을 작성할 수 있다면 Coroutines를 사용하겠다는 JDER의 제안은 매우 잘 작동합니다. LUA_PCALL ()을 사용하여 LUA를 입력하지만 진입 점은 Coroutine Manager 기능입니다.

C 루틴이 기다리는 동안 아무것도하지 않는 경우에만 작동합니다. 예를 들어 무언가를 계산하기 때문에 오래 달리면 여러 OS 스레드를 실행해야합니다. Lua는 ThreadSafe입니다. 각 스레드에서 여러 스레드를 만들고 lua_open ()을 실행합니다.

에서 http://www.lua.org/pil/24.1.html

LUA 라이브러리는 전역 변수를 전혀 정의하지 않습니다. 그것은 모든 상태를 동적 구조 LUA_STATE에서 유지 하고이 구조에 대한 포인터는 LUA 내부의 모든 기능에 대한 인수로 전달됩니다. 이 구현으로 Lua Reintrant와 Multithreaded Code에서 사용할 수 있습니다.

두 가지 접근 방식을 결합 할 수도 있습니다. OS 스레드를 시작하는 래퍼 LUA 함수가있는 경우 스레드를 시작한 후에는 생성 할 수 있습니다. 코 루틴 관리자는 스레드를 추적하고 시작한 스레드가 완료되었을 때 코 루틴을 계속합니다. 이를 통해 Pure C 코드를 실행하는 여러 작업자 스레드가있는 단일 LUA 통역사를 사용할 수 있습니다.

OS 스레딩 방식으로 이동하면 살펴보십시오. 루아 레인. 나는 당신이 달성하려는 것에 대한 완벽한 솔루션을 보게 될 것입니다 (= 하나의 addon 모듈을 믹스에 던지면 멀티 스레딩이 매끄럽게 내장되어있는 명확하고 이해할 수 있으며 간단한 코드를 만들 것입니다).

문제가 어떻게 해결되었는지 알려주세요. :)

그렇습니다 디버깅 인터페이스 돕다?

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top