2015-11-10 2 views
0

Есть ли какой-либо механизм в TCL, с помощью которого я могу проверить TCL Script для перехода в бесконечный цикл?TCL - вызов специальной функции, если скрипты идут в бесконечном цикле

Например, У меня есть Test.tcl, из которого я хочу проверить, что мой a.tcl переходит в бесконечный цикл или нет? Если мой a.tcl переходит в бесконечный цикл, можно ли вызвать определенную функцию, что «ваш a.tcl переходит в бесконечный цикл».

Тип таймеров в c.

Надеюсь, что я понятен.

Благодаря

ответ

2

Посмотрите на 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]" 
    } 
} 
+0

VWait детектор бесконечный контур выключен в резьбовом режиме IIRC - код знает, что это просто не может видеть внутри, что другие потоки до - и это по умолчанию в современном Tcl строит. Пределы - лучший встроенный подход, хотя установка обработчика сигналов через асинхронный API тоже может работать (к сожалению, требуется расширение, такое как TclX или Expect; эта функция не отображается в API-интерфейсе Tcl по умолчанию). –

+0

Привет @DonalFellows Интер ограничивает $ i время-секунда 1 работает неправильно. означает, что я ожидаю, что мой цикл будет прерываться через 1 секунду. Это правда. или мне нужно что-то –

+1

@Axit Soni: Прочтите документацию. -секунды 1 означает, что вы хотите установить предел в 1. января 1970 года 00:00:01. (его также написано -секунды с 's') – schlenk

Смежные вопросы