【问题标题】:how to invoke callback tcl procedure from c如何从c调用回调tcl过程
【发布时间】:2014-02-26 16:53:14
【问题描述】:

我正在研究 Tcl。并使用 swig 用 C 扩展 TCL 命令。 现在,我希望 C 中的扩展命令回调 tcl 过程。 但我不知道。

请帮帮我。

首先,我在 swig 中实现了一个调度程序函数,它调用 mrecv。 在我的 tcl 脚本中。我打电话给 mrecv 来接收消息。所以,当消息到达时,我希望 mrecv 可以通知 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 中的过程名称。

【问题讨论】:

  • 你能把你的问题说得更具体一些吗?目前这对于 StackOverflow 来说有点太宽泛了。到目前为止,您尝试过什么,您在哪里卡住了?
  • 真的不想经常创建解释器(它们是重量级的)并且它们没有被垃圾收集。您可能还想使用现有的,以便用户可以在您必须实际处理回调之前进行设置……

标签: c callback tcl swig


【解决方案1】:

您需要查看执行 Tcl 脚本的 Tcl_Eval 系列函数。它们将第一个参数作为指向要运行脚本的 Tcl 解释器的指针;指针是当前的解释器,是传递给 SWIG 将生成的 C 函数的参数之一。

目前,您的 testCallback() 函数会创建一个新的 Tcl_Interp 并评估该新 interp 中的命令。您要做的是在您运行 mrecv 3000 的同一 Tcl_Interp 中评估命令。

为了做到这一点,你必须说服 SWIG 将 Tcl_Interp 传递到你的 mrecv 函数中,我认为你可以使用 SWIG 类型映射功能来做到这一点。

如果你创建一个新的类型图:

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

并将函数的签名更改为:

W16 mrecv(int timeout, Tcl_Interp *interp)

那么 SWIG 应该自动将 Tcl_Interp 传递到您的 mrecv 函数中,而无需您更改 Tcl 代码。

请参阅here 了解类型映射的来源,并参阅here 了解有关使这成为可能的 in 类型映射的更多信息。

【讨论】:

  • 非常感谢。我已经详细说明了我的问题。
  • @user3350310 我认为以上内容现在回答了您的问题。
  • 特别是,Tcl_Eval 用于运行脚本,Tcl_EvalObjv 用于调用带有文字参数的单个命令。
猜你喜欢
  • 2013-06-12
  • 1970-01-01
  • 2013-05-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-03
相关资源
最近更新 更多