我刚刚发现这样的MathLink
功能为LinkWrite
and LinkRead
有类似其内部的东西CheckAbort
吸收任何中止,并且不会进一步传播它们。
这可以很容易地显示为LinkRead
:
link = LinkLaunch[First[$CommandLine] <> " -mathlink"];
LinkRead[link];
LinkWrite[link, Unevaluated[Pause[10]]];
{LinkRead[link], Print["!!"]}
After evaluating the above code press Alt+. and you will get the following output:
During evaluation of In[6]:= !!
Out[9]= {ReturnPacket[$Aborted], Null}
正如你所看到的,中止被吸收了LinkRead
.
我的问题是它打破了我自己的基于评估的流程控制CheckAbort
.
有没有办法拦截由此类函数吸收的中止LinkRead
and LinkWrite
?
MathLink 的工作方式,LinkRead
如果链接上没有任何内容可读取,则会阻塞。如果您此时尝试中止,则会通过 MathLink 消息通道将中止消息传递到链接的另一端。如果另一端的程序表现良好,它将放弃正在执行的任何操作并发送一个返回值(在许多情况下)$Aborted
)。如果您想将中止传播到链接的末尾,以便可以使用以下命令捕获它CheckAbort
,您将需要检查返回值并生成另一个中止,例如:
If[LinkRead[link] == $Aborted, Abort[]]
如果您知道链接的另一端返回,则此方法有效$Aborted
万一它被中止。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)