2014-02-25 3 views
0

Tcl에서 작업 중입니다. swig를 사용하여 C로 TCL 명령을 확장하십시오. 이제 C에서 확장 명령을 사용하여 tcl 절차를 콜백 할 수 있습니다. 그러나 나는 그것에 대해 모른다.C에서 콜백 tcl 프로 시저를 호출하는 방법

도와주세요.

먼저 swig에서 mrecv를 호출하는 디스패처 기능을 구현합니다. 그리고 내 tcl 스크립트에서. mrecv에게 메시지 수신을 요청합니다. 그래서, 메시지가 도착했을 때, 나는 tcl이 mrecv에 의해 통지 될 수 있기를 바란다. 그래서 c에서 콜백 tcl 프로 시저를 호출하는 방법을 찾아야합니다.

그리고 내 코드는 breifly입니다

W16 mrecv(int timeout) { 
    W16 res; 
    Msg_t *msg = NULL; 
    APP_EVENT_T eventList[255]; 
    int listLength = 255; 

    while (1) { 
     readAgain = 0; 
     msg = malloc(sizeof(Msg_t)); 
     if (!msg) { 
      return RETURN_ERR; 
     } 
     memset(msg, 0, sizeof(Msg_t)); 
     res = MsgRecvEvent(msg, eventList, &listLength, timeout); 
     if (res == RETURN_OK) { 
      msgDispatcher(msg); 
     } 
     free(msg); 

    }        
    return res; 
} 
void msgDispather(void *msg) { 
    /*notify tcl*/ 
} 

하고 내 TCL 스크립트입니다. 나는 mrecv 명령을 호출한다. TCL 스크립트 :

res [ mrecv 3000 ] 

나는 TCL을 통지하는 방법을 알아야합니다.

아래는 내 테스트 데모입니다.

int testCallback (char * str) { 
    Tcl_Interp *interp; 
    interp=Tcl_CreateInterp(); 
    Tcl_Eval(interp,str); 
    return 0; 
} 

testCallback()은 tcl에서 호출 할 확장 cmd입니다. str은 tcl의 프로 시저 이름입니다.

+0

질문을 좀 더 구체적으로 작성할 수 있습니까? StackOverflow가 현재로서는 너무 광범위합니다. 지금까지 시도한 것은 무엇이고 어디에서 붙어 있습니까? – starsplusplus

+0

당신은 _ 너무 자주 인터프리터를 만들고 싶지 않습니다. (그들은 중량급입니다.) 가비지 수집이 아닙니다. 실제로 콜백을 처리하기 전에 사용자가 설정을 할 수 있도록 기존의 것을 사용하고 싶을 것입니다 ... –

답변

2

Tcl 스크립트를 실행하는 Tcl_Eval 계열의 함수를 살펴 봐야합니다. 이들은 스크립트가 실행될 Tcl 인터프리터에 대한 포인터를 첫 번째 매개 변수로 취한다. 포인터는 현재 interpeter인데 SWIG가 생성 할 C 함수에 전달 된 매개 변수 중 하나입니다.

현재 testCallback() 함수는 새 Tcl_Interp를 만들고 해당 새 interp에서 명령을 평가합니다. 당신이하고 싶은 것은 동일한 Tcl_Interp에서 mrecv 3000을 실행 한 명령을 평가하는 것입니다.

이렇게하려면 SWIG가 mclv 함수에 Tcl_Interp를 전달하도록 설득해야하며 SWIG typemap 기능을 사용하여이 작업을 수행 할 수 있다고 생각합니다.

새 타입 맵 만드는 경우 :

%typemap(in,numinputs=0) Tcl_Interp *interp { 
    $1 = interp; 
} 

을하고 함수의 서명을 변경 자동으로 필요없이 MRECV 기능에 Tcl_Interp을 통과해야 다음

W16 mrecv(int timeout, Tcl_Interp *interp) 

꿀꺽 꿀꺽 Tcl 코드를 변경합니다.

typemap의 출처에 대해서는 here을, 이것을 가능하게하는 typmap에 대해서는 here을 참조하십시오.

+0

고맙습니다. 나는 내 질문에 대해 자세히 설명했다. – user3350310

+0

@ user3350310 위의 내용이 귀하의 질문에 대한 답변이라고 생각합니다. – Jackson

+0

특히,'Tcl_Eval'은 스크립트를 실행하기위한 것이고'Tcl_EvalObjv'는 리터럴 인자들을 가진 하나의 명령을 호출하기위한 것입니다. –

관련 문제