CheckAbort внутри функций MathLink?
Я только что обнаружил, что такие 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
Как работает MathLink, LinkRead
блокирует, если читать по ссылке нечего. Если вы попытаетесь прервать в это время, сообщение прерывания передается по каналу сообщения MathLink на другой конец ссылки. Если программа на другом конце ведет себя красиво, она отбросит все, что она делает, и отправит возвращаемое значение (во многих случаях $Aborted
). Если вы хотите размножить прервать до конца ссылки, чтобы вы могли поймать ее с помощью CheckAbort
, вам нужно будет проверить возвращаемое значение и сгенерировать еще один прервать, например:
If[LinkRead[link] == $Aborted, Abort[]]
Это работает, если вы знаете, что другой конец ссылки возвращает $Aborted
в случае его прерывания.