12

我刚刚发现这样的MathLink函数LinkWriteLinkRead有类似它自己的内部的东西CheckAbort,可以吸收任何中止,并且不会进一步传播它们。

这可以通过以下方式轻松显示LinkRead

link = LinkLaunch[First[$CommandLine] <> " -mathlink"];
LinkRead[link];
LinkWrite[link, Unevaluated[Pause[10]]];
{LinkRead[link], Print["!!"]}

评估上述代码后按Alt+ .,您将获得以下输出:

During evaluation of In[6]:= !!
Out[9]= {ReturnPacket[$Aborted], Null}

如您所见,中止被LinkRead.

我的问题是它打破了我自己基于CheckAbort.

有没有办法拦截被 和 等函数吸收的LinkRead中止LinkWrite

4

1 回答 1

1

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

 If[LinkRead[link] == $Aborted, Abort[]]

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

于 2014-11-20T15:11:02.730 回答