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

时间:2014-11-13 14:54:05

标签: multithreading asynchronous tcl

我正在使用与Tcl解释器无关的C线程(我使用pthreads)做一些工作。它拥有指向现有Tcl线程的ThreadId和TclInterp的指针,并希望将脚本发送到此Tcl线程以进行异步求值。

我可以同步使用XThreadUtil并且只有在C线程完成执行之前阻塞Tcl线程。我真的需要异步行为。也就是说,所需的事件序列是:

  1. tcl thread调用生成C线程并立即返回的命令;
  2. tcl线程的事件循环恢复,C线程同时完成其工作;
  3. 当C线程完成工作时,它会将事件发布到tcl线程的事件队列并退出;
  4. tcl线程在准备好时处理事件。
  5. 我尝试过使用Tcl线程通知API(Tcl_ThreadQueueEvent / Tcl_ThreadAlert)和异步API(Tcl_AsnycCreate / Tcl_AsyncMark),运气不佳。我还没有找到很多例子。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:3)

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

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