Посмотрите на interp limit
функций, что позволяет что-то подобное.
Обнаружение бесконечного цикла похоже на halting problem
, поэтому вы можете установить только время ожидания, которое вы хотите подождать, но на самом деле не обнаруживаете, действительно ли существует бесконечный цикл в общем случае.
В некоторых особых случаях Tcl предупреждает вас, если вы пытаетесь создать бесконечный цикл, особенно при попытке запустить цикл событий (через vwait forever
), когда источник событий не зарегистрирован.
Для interp limit
смотрите документацию по адресу: http://www.tcl.tk/man/tcl/TclCmd/interp.htm#M22
Он имеет пример для прекращения бесконечного цикла в subinterpreter после определенного количества команд, выполняемых.
set i [interp create]
interp limit $i command -value 1000
interp eval $i {
set x 0
while {1} {
puts "Counting up... [incr x]"
}
}
Вы также можете ограничить время, разрешенное для выполнения.
set i [interp create]
# set a limit to now + 1 seconds
interp limit $i time -seconds [expr {[clock seconds] + 1}]
interp eval $i {
set x 0
while {1} {
puts "Counting up... [incr x]"
}
}
VWait детектор бесконечный контур выключен в резьбовом режиме IIRC - код знает, что это просто не может видеть внутри, что другие потоки до - и это по умолчанию в современном Tcl строит. Пределы - лучший встроенный подход, хотя установка обработчика сигналов через асинхронный API тоже может работать (к сожалению, требуется расширение, такое как TclX или Expect; эта функция не отображается в API-интерфейсе Tcl по умолчанию). –
Привет @DonalFellows Интер ограничивает $ i время-секунда 1 работает неправильно. означает, что я ожидаю, что мой цикл будет прерываться через 1 секунду. Это правда. или мне нужно что-то –
@Axit Soni: Прочтите документацию. -секунды 1 означает, что вы хотите установить предел в 1. января 1970 года 00:00:01. (его также написано -секунды с 's') – schlenk