2014-01-10 5 views
0

나는 큰 문제는 있지만 아마 간단한 것에서 내 머리카락을 꺼냈다.QT 스레드의 루아 스크립트

QT에서 서버 응용 프로그램을 개발하고 있습니다. 이 서버는 특정 및 독점 이더넷 제품과의 TCP 연결 및 대화 상자를 허용합니다.

제품이이 서버에서 호출 될 때마다 새 TCP 연결로 새 스레드가 만들어지고 "일반적인"요청으로 대화 상자가 시작됩니다.

이 대화 상자의 특정 단계에서 스레드는 프로세스를 계속 진행하기 위해 Lua 스크립트를 실행해야합니다. 일반적인 절차가 아닌 각 제품에 대한 특정 스크립트입니다. 내가 루아 스크립트를 실행하면

, 나는 Thread 클래스 (현재의 thread)의 방법을 사용해야합니다

내 문제입니다. Lua 스크립트에서 사용할 수있는 C 함수의 Extern "C"선언으로 인해 현재 스레드의 메서드를 호출 할 수 없습니다.이 교환의 구조를 프로그래밍하는 방법 (또는 그 원리)을 볼 방법이 없기 때문에 : - 스레드는 프로토콜에 따라 IP에 데이터를 보내는 N 개의 메소드를 가지고 있습니다.이 메소드는 mythread :: CClass_fn_X()라고 부릅니다. - 루아에 등록 된 함수 C는 LUA_FN_X()를 호출합니다. 이것은 그냥 루아에서 계산 된 매개 변수와 CClass_fn_X()를 호출하는 게이트웨이입니다) LUA_FN_X()에있는 경우

나는 "이 -> CClass_fn_X()"하고 싶지, C 루아 기능은 참조가 없기 때문에 나는 할 수 없어 스레드의 "this".

지난 며칠 동안 여러 가지 시도를 해본 결과 문제의 해결책 (또는 단순히 모든 해결책)을 찾을 수 없습니다.

제발 도와주세요, 나는 코드를 요구하지 않지만, 단지 그것을하는 원리입니다.

또한 Lua 인터프리터는 안전합니까? 다른 스레드에서 루아 스크립트를 개별적으로 실행할 수 있습니까?

답변

3

마지막 질문에 답하기 위해 Lua는 다른 OS 스레드에서 동일한 Lua 상태를 사용하는 경우 OS 스레드 안전하지 않지만 다른 OS 스레드에서 다른 Lua 상태를 안전하게 실행할 수 있습니다.

coroutine이고 동일한 상태로 실행되는 루아 스레드와 OS 스레드를 혼동하지 마십시오.

0

이렇게하는 방법에는 여러 가지가 있습니다. 루아 스크립트를 호출 할 수있는 비 메인 쓰레드가 하나뿐이라면, 쓰레드는 그것이 속한 쓰레드 객체를 알아야하고, C++로 호출 할 때 매개 변수로 제공해야합니다. 거기에서 작동 할 수있는 많은 전략이 있지만, 하나는 스레드에 대한 간단한 사용자 데이터 (기본적으로 스레드를 식별하기에 충분한 포인터 또는 핸들) 인 전역 변수를 만드는 것입니다. 그런 다음 스크립트를 호출하면 스크립트는 해당 가벼운 userdata로 C 함수를 호출합니다. C 함수는받은 사용자 데이터를 실제로 포인터 또는 핸들 또는 정수 (어떤 전략이든)가 스레드라고 가정해야합니다. 그런 다음 올바른 스레드 인스턴스를 찾을 수 있습니다 적절한 방법을 호출하십시오.예를 들어, C++ : 사이드

// tell Lua which thread: 
lua_pushlightuserdata(L, threadHandle); // threadHandle uniquely identifies thread 
lua_setglobal(L, "scriptThread"); 

// call script: 
// assumes you loaded script before and saved the compiled chunk 
// as global variable "script" (other SO question shows how to do it) 
lua_getglobal(L, "script"); 
lua_pcall(L, 0, 0, 0); 

및 루아 스크립트

-- call C++ func: 
LUA_FN_X(scriptThread); 

하고 LUA_FN_X로 루아 상태에서 등록 된 C/C++ 래퍼 함수 :

void cwrapper(lua_State* L) 
{ 
    Thread* thread = (Thread*)lua_touserdata(L, -1); 
    thread->CClass_fn_X(); 
} 

루아는 가벼운 userdata로 C++로 돌아가는 것을 제외하고는 많은 것을 할 수 없다. 다양한 스레드 메소드를 쿼리하고 거기에 Lua 스크립트를 호출 할 수있는 여러 스레드 인스턴스가 있다면 전체 사용자 데이터를 사용하는 것이 좋습니다.