Ale*_*kov 12 wolfram-mathematica mathlink
我刚刚发现这样的MathLink
函数,LinkWrite
并且LinkRead
具有类似于它自己的内部的东西CheckAbort
,可以吸收任何中止,并且不会进一步传播它们.
这可以很容易地显示LinkRead
:
link = LinkLaunch[First[$CommandLine] <> " -mathlink"];
LinkRead[link];
LinkWrite[link, Unevaluated[Pause[10]]];
{LinkRead[link], Print["!!"]}
Run Code Online (Sandbox Code Playgroud)
在评估上面的代码后按Alt+ .,您将得到以下输出:
During evaluation of In[6]:= !!
Out[9]= {ReturnPacket[$Aborted], Null}
Run Code Online (Sandbox Code Playgroud)
如你所见,中止被吸收了LinkRead
.
我的问题是它打破了我自己的评估流量控制CheckAbort
.
有没有办法拦截将中止这种功能被吸收LinkRead
和LinkWrite
?
小智 1
MathLink 的工作方式是,LinkRead
如果链接上没有任何内容可读取,则会阻塞。如果您此时尝试中止,则会通过 MathLink 消息通道将中止消息传递到链接的另一端。如果另一端的程序表现良好,它将放弃正在执行的任何操作并发送返回值(在许多情况下$Aborted
)。如果您想将中止传播到链接的末尾,以便可以使用 捕获它CheckAbort
,则需要检查返回值并生成另一个中止,例如:
If[LinkRead[link] == $Aborted, Abort[]]
Run Code Online (Sandbox Code Playgroud)
如果您知道链接的另一端会$Aborted
在链接被中止时返回,则此方法有效。