CheckAbort внутри функций MathLink? - PullRequest
12 голосов
/ 12 апреля 2011

Я только что обнаружил, что такие MathLink функции, как LinkWrite и LinkRead имеют что-то вроде своего внутреннего 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?

1 Ответ

1 голос
/ 20 ноября 2014

Как работает MathLink, LinkRead блокируется, если по ссылке нечего читать. Если вы попытаетесь прервать в это время, сообщение об отмене передается по каналу сообщений MathLink на другой конец ссылки. Если программа на другом конце ведет себя хорошо, она отбросит все, что делала, и отправит возвращаемое значение (во многих случаях $Aborted). Если вы хотите распространить прерывание на конец ссылки, чтобы вы могли перехватить его с помощью CheckAbort, вам нужно будет проверить возвращаемое значение и сгенерировать другое прерывание, например:

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

Это работает, если вы знаете, что другой конец ссылки возвращает $Aborted в случае, если она прервана.

...