我有一个C函数,我想提供给Tcl。问题是,我想以与:: thread :: send相同的方式使调用与Tcl异步,即使用?-async?和?varname?标志。
我不了解Tcl的异步C API,也无法找到有关如何使用它的任何示例。在C方面,我可以创建一个线程来完成工作,但后来不知道如何在线程完成时发出信号,以及如何处理信号以设置由Tcl命令中传递的varname选项指定的变量。
对于这个问题,我无法使用Tcl方面的更简单的异步解决方案,例如使用管道,Tcl线程或诸如comm之类的库调用另一个进程。这样做的原因是C调用在大型数据结构中加载,并且还有其他C调用暴露给Tcl,它假设(必要时)结构的内存是在与Tcl interp相同的线程中分配的。 / p>
非常感谢任何协助。
答案 0 :(得分:1)
最简单的方法是编写C代码以与简单的API同步,并将其所有状态保存在ClientData
中 - 如果可能的话,附加到命令或解释器的转换结构,或使用线程失败特定数据。然后,使用Thread包本身允许其他线程调用这些实用程序线程,并将其包装在Tcl代码中,使得API看起来很自然,并且(轻易地)隐藏了如何实现API。这很容易做到。
您也可以使用Tcl' C level thread API,因为Thread包实际上只是一个包装器。 (它实际通过在线程之间发送事件进行通信;在线程包中查看ThreadSend
的定义以获取血淋淋的细节。)或者,如果您真的只是我/我O,您可以编写代码以使用异步I / O和fileevent
/通知程序机制。这些比上面概述的简单方法更简单,并使用Tcl代码和现有包来完成大部分工作。
答案 1 :(得分:0)
您需要使用TCL Extension Architecture,a.k.a。 TEA 。