> -- Илья Ермаков писал(а):
> Я бы выставил interrupted с помощью метапрограммирования (Kernel-средствами).
Интересная идея, спасибо : )

Это всё же не решает проблему "тихого" прерывания: открывается окно трэпа "прерывание с клавиатуры", а причём здесь клавиатура? Видимо, придётся немного доработать Kernel.TryHandler и ввести дополнительные возможности. Сделал вот как: добавил опубликованную процедуру Kernel.TrapMainThread, перенёс в неё код из обработчика Ctrl-Break (эта процедура теперь оттуда вызывается). Получается законный способ прервать работу.
## Код:
```
PROCEDURE TrapMainThread* (silent: BOOLEAN; timeOut: INTEGER): BOOLEAN;
(* Interrupt the current activity of the main thread with a trap. If silent, don't show any trap window, otherwise "keyboard interrupt" will be reported. The main thread will not be interrupted if it is currently running in the Kernel module. If timeOut > 0, it specifies the time in msec during which to try to interrupt the main thread. If timeOut < 0 then try until success. If timeOut = 0, then try exactly once. The procedure returns TRUE on success or FALSE on timeout. *)
```

PS: Знаю, что в ядре копаться не хорошо, что это потом всё труднее и труднее поддерживать и портировать между версиями Блэкбокса. Удалось в данном случае отделаться минимальным вмешательством и исключительно расширением интерфейса. С другой стороны, как иначе реализовать необходимый функционал, если изначально требуемая гибкость не заложена? Теперь получится, что доработанная мной подсистема Info21olimp не со всяким ядром будет работать.
Вот здесь-то мне и пригодится метапрограммирование. Буду искать в Kernel процедуру TrapMainThread. Если есть - вызывать, если нет - пользователь увидит клавиатурный трэп. Но это я буду завтра дорабатывать, сейчас отдыхать пора.