MathLink函数中的CheckAbort?

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.

有没有办法拦截将中止这种功能被吸收LinkReadLinkWrite

小智 1

MathLink 的工作方式是,LinkRead如果链接上没有任何内容可读取,则会阻塞。如果您此时尝试中止,则会通过 MathLink 消息通道将中止消息传递到链接的另一端。如果另一端的程序表现良好,它将放弃正在执行的任何操作并发送返回值(在许多情况下$Aborted)。如果您想将中止传播到链接的末尾,以便可以使用 捕获它CheckAbort,则需要检查返回值并生成另一个中止,例如:

 If[LinkRead[link] == $Aborted, Abort[]]
Run Code Online (Sandbox Code Playgroud)

如果您知道链接的另一端会$Aborted在链接被中止时返回,则此方法有效。