Для VisualWorks существует открытый Store-репозиторий, содержащий ряд полезных пакетов. Некоторые из них мы рассматривали раннее. Сегодня же остановимся еще на двух пакетах.
Первоначально пакет первоначально был разработан для Squeak. И позже портрован на VW.
После загрузки пакета порождается процес с высоким приоритетом. Этот процес постоянно отслеживает глубину стека каждого процесса и если превышена определённая глубина (вероятно зацикливание), то процесс останавливается и открывается в отладчике, что позволяет обнаружить причину роста стека.
По умолчанию, порог, после которого открывается отладчик, установлен в 100'000 вызовов. См. метод класса Process class>>stackOverflowLimit
Порог для срабатывания можно установить для каждого просесса отдельно. Для этого нужно послать процессу сообщение #stackOverflowLimit: с аргументом - порогом срабатывания.
Что-бы проверить работу утилиты создайте класс Test с одним методом:
rec self rec
И затем в workspace выполните команду Test new rec
Первоначально это расширение так же было разработано для Squeak.
После загрузки этого пакета у вас появится возможность запускать операции, ограничивая время их выполнения.
Для того, что-бы ограничить время работы блока, нужно послать этому блоку сообщение #valueWithin:onTimeout:. Параметр valueWithin: задаёт время работы блока-получателя сообщения. Это объект класса Squeak.Duration (этот класс определён в пакете Squeak-Chronos). Параметр onTimeout: это блок, который запускается на выполнение при достижении тайм-аута. Если тайм-аут не достигнут, то метод возвращает результат работы блока-получателя, если достигнут - результат работы блока onTimeout:.
Рассмотрим примеры:
[ 50000 factorial ] valueWithin: 1 second onTimeout: [ 666 ]. возвращает 666 [ 3 + 4 ] valueWithin: 1 second onTimeout: [ 666 ]. возвращает 7
Советую обратить внимание на эти пакеты, так как каждый из них состоит всего из пары методов, отлично демонстрируя возможности расширения Smalltalk-а
Ярлыки: vw