- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我有一个 C 函数,我想将其提供给 Tcl。问题是,我想以与::thread::send 相同的方式从 Tcl 进行异步调用,即使用 ?-async?和?变量名?旗帜。
我不了解 Tcl 的异步 C API,也找不到任何示例来说明如何使用它。在 C 端,我可以创建一个线程来完成工作,但不知道如何在线程完成时发出信号,以及如何处理信号以设置 Tcl 命令中传递的 varname 选项指定的变量。
对于这个问题,我无法从 Tcl 端使用更简单的异步解决方案,例如使用管道、Tcl 线程或 comm 等库调用另一个进程。这样做的原因是 C 调用加载在一个大数据结构中,并且还有其他 C 调用暴露给 Tcl,它们假设(出于必要)结构的内存是在与 Tcl interp 相同的线程中分配的。
如有任何帮助,我们将不胜感激。
最佳答案
最简单的方法是编写与简单 API 同步的 C 代码,并将其所有状态保存在附加到命令或解释器的 ClientData
中,如果可能的话,或者失败,使用特定于线程的数据。然后,使用 Thread 包本身允许其他线程调用这些实用程序线程,并将其包装在 Tcl 代码中,使 API 看起来很自然,并且(轻微地)隐藏了您如何实现 API。这很容易做到。
您也可以使用 Tcl 的 C level thread API因为 Thread 包实际上只是它的包装器。 (它实际上通过在线程之间发送事件进行通信;查看 Thread 包中 ThreadSend
的定义以了解详细信息。)或者,如果您真的只做 I/O,您可以编写代码以使用异步 I/O 和 fileevent
/notifier 机制。这些比仅仅按照上面概述的简单方法做事并使用 Tcl 代码和现有包来完成大部分工作要复杂得多。
关于c - 如何为 Tcl 编写异步 C 扩展?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23220651/
我是一名优秀的程序员,十分优秀!