如何从非Tcl线程异步调用Tcl线程中的命令



我在一个与Tcl解释器无关的C线程中做一些工作(我使用的是pthreads)。它拥有指向现有Tcl线程的ThreadId和TclInterp的指针,并希望向该Tcl线程发送一个要异步求值的脚本。

只有当我阻塞Tcl线程直到C线程完成执行时,我才能使用XThreadUtil同步地执行它。我真的需要异步行为。也就是说,所需的事件序列是:

  1. tcl线程调用生成C线程的命令并立即返回
  2. tcl线程的事件循环恢复,C线程同时完成它的工作
  3. 当C线程完成工作时,它将一个事件发布到tcl线程的事件队列并退出
  4. tcl线程在准备就绪时处理事件

我尝试过使用Tcl线程通知API(Tcl_ThreadQueueEvent/Tcl_ThreadAlert)和异步API(Tcl_AsnycCreate/TclAsyncMark),但运气不佳。我找不到太多例子。非常感谢您的帮助。

Tcl_ThreadQueueEvent和Tcl_ThreadAlert是我过去使用过的。您需要记住使用Tcl_GetCurrentThread进行警报调用的Tcl主线程的线程id。

tmsWinMailslot中有一个示例,如果您查看MailslotSignolledProc,它从监视此代码中Windows mailslot的工作线程引发Tcl事件。它使用Windows重叠I/O,因此一旦某些数据在被阻止的工作线程上可用,该函数就会读取并将其作为事件发布到Tcl,然后再次开始读取以等待更多数据。

最新更新