[英]how to invoke callback tcl procedure from c
我正在研究Tcl。 并使用swig用C扩展TCL命令。现在,我希望C中的扩展命令回调tcl过程。 但我不知道。
请帮我。
首先,我在swig中实现一个调度函数,调用mrecv。 在我的tcl脚本中。 我打电话给mrecv接收消息。 所以,当消息到达时,我希望mclv可以通知tcl。 这就是为什么我需要找到一种从c调用回调tcl过程的方法。
我的代码很简单
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中的过程名称。
您需要查看执行Tcl脚本的Tcl_Eval函数系列。 这些第一个参数是一个指向脚本运行的Tcl解释器的指针; 并且指针是当前的interpeter是传递给SWIG将生成的C函数的参数之一。
目前,您的testCallback()函数创建一个新的Tcl_Interp,并在该新的interp中评估该命令。 您要做的是在运行mrecv 3000
的同一Tcl_Interp中评估命令。
为了做到这一点,你必须说服SWIG将Tcl_Interp传递给你的mrecv函数,我认为你可以使用SWIG类型映射功能来实现。
如果您创建新的typemap:
%typemap(in,numinputs=0) Tcl_Interp *interp {
$1 = interp;
}
并将您的函数签名更改为:
W16 mrecv(int timeout, Tcl_Interp *interp)
那么SWIG 应该自动将Tcl_Interp传递给你的mrecv函数,而不需要更改Tcl代码。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.