подавился бубликом. а after, vwait и fileevent там тогда для чего ?
>Классическая tcl-ная программа однопоточна
философия Tcl не предполагает прямого доступа к абстракции потока, но из этого отнюдь не следует её однопоточность. причём использовать потоки ОС вместо своих "лёгких" внутренних потоков Tcl Core тоже может - для этого достаточно собрать интерпретатор с соответствующим ключом
вообще фееричное утверждение, особенно неожиданное от человека, который на Tcl (насколько я помню) регулярно пишет
т.е. в однопоточной, но событийной программе можно запустить фоном бесконечные вычисления и при этом отрисовывать виджеты и обрабатывать события от них?
>подавился бубликом. а after, vwait и fileevent там тогда для чего ?
А как с помощью vwait, к примеру, ожидать изменение переменной в фоне, чтобы выполнение программы продолжалось? vwait вроде как останавливает выполнение до тех пор, пока она сама не исполнится.
>А как с помощью vwait, к примеру, ожидать изменение переменной в фоне, чтобы выполнение программы продолжалось? vwait вроде как останавливает выполнение до тех пор, пока она сама не исполнится
фоновое выполнение запускается с помощью after, в самом простом случае с помощью after idle - т.е. выполнить код как только появится возможность. а внутри блока кода уже можно ожидать изменения : after idle { vwait ::var }
>т.е. в однопоточной, но событийной программе можно запустить фоном бесконечные вычисления и при этом отрисовывать виджеты и обрабатывать события от них?
вполне. единственный подводный камень именно в Tcl/Tk - команда exec игнорирует стандартный event loop; чтобы этот момент обойти написали bgexec :
т.е. я правильно понял, что после выполнения каждого оператора, тикль проверяет список отложенных событий и реагирует на одно из них?
как если бы пользователь вручную ставил после каждого оператора after idle.
>т.е. я правильно понял, что после выполнения каждого оператора, тикль проверяет список отложенных событий и реагирует на одно из них? как если бы пользователь вручную ставил после каждого оператора after idle.
> подавился бубликом. а after, vwait и fileevent там тогда для чего ?
ну так можно и программу с alarm() считать имеющей "фоновый" режим :)
>>Классическая tcl-ная программа однопоточна
> философия Tcl не предполагает прямого доступа к абстракции потока, но из этого отнюдь не следует её однопоточность. причём использовать потоки ОС вместо своих "лёгких" внутренних потоков Tcl Core тоже может - для этого достаточно собрать интерпретатор с соответствующим ключом
>фоновое выполнение запускается с помощью after, в самом простом случае с помощью after idle - т.е. выполнить код как только появится возможность. а внутри блока кода уже можно ожидать изменения : after idle { vwait ::var }
Здорово. Казалось бы, причём тут выполнение в моменты простоя, но то, что нужно.
> вполне. единственный подводный камень именно в Tcl/Tk - команда exec игнорирует стандартный event loop;
зато open не игнорирует :)
set fd [ open /path/to/apps "r" & ]
fileevent $fd readable [ list handle_app_out_proc $fd ]
>ну так можно и программу с alarm() считать имеющей "фоновый" режим :)
паттерн Proactor из ACE не использует многопоточность, основываясь на системных механизмах асинхронного ввода-вывода - так что же, не относить его к механизмам параллелизации из-за этого ? как по мне, главное - выполняется ли поставленная задача, а как именно - вопрос качества дизайна - и подход Tcl в этом плане один из самых красивых. к слову сказать в QNX Neutrino примитивы синхронизации POSIX дополнены набором функций, практически один в один дублирующих механизм after/vwait. в общем, jedem das seine
"...by default, Tcl 8.4 is compiled without thread support and without script-level access to threads...so, now you can just build Tcl 8.3 (or 8.4) with threads enabled and load the thread extension..." - к 8.5 это также относится