Подтвердить что ты не робот

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?

4b9b3361

Ответ 1

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

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

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