如何在非Tcl线程中异步地调用Tcl线程中的命令?

4
我正在使用pthread在一个C线程中进行编程工作,该线程没有与Tcl解释器相关联。它具有指向现有Tcl线程的ThreadId和TclInterp的指针,并希望将脚本发送到此Tcl线程以进行异步评估。
我可以使用XThreadUtil同步地完成此操作,但只能在阻塞Tcl线程直到C线程执行完毕时才能完成。我真的需要异步行为。即,所需的事件顺序是:
1. Tcl线程调用生成C线程并立即返回的命令; 2. Tcl线程的事件循环恢复,C线程同时执行其工作; 3. 当C线程完成工作时,它会向Tcl线程的事件队列发布事件并退出; 4. Tcl线程在准备好时处理事件。
我尝试使用Tcl线程通知API(Tcl_ThreadQueueEvent/Tcl_ThreadAlert)和async API(Tcl_AsnycCreate/Tcl_AsyncMark),但没有太多运气。我还没有找到太多示例。非常感谢任何帮助。
1个回答

5

Tcl_ThreadQueueEvent和Tcl_ThreadAlert是我过去使用的。您需要记住Tcl主线程的线程ID,以便在使用Tcl_GetCurrentThread进行警报调用时进行警报。

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


这看起来就是我需要的。非常感谢。 - Dabo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接