Spec-Zone.ru › Tcl/Tk

после

Имя
after — Выполнение команды после задержки
Синтаксис
Описание
после мс
после мс ?скрипт скрипт скрипт ...?
после отмена id
после отмена скрипт скрипт ...
после в_простой скрипт ?скрипт скрипт ...?
после информация ?id?
Примеры
См. также
Ключевые слова

Имя

после — Выполнение команды после задержки

Синтаксис

после мс
после мс ?скрипт скрипт скрипт ...?
после отмена id
после отмена скрипт скрипт скрипт ...
после в_простой ?скрипт скрипт скрипт ...?
после информация ?id?

Описание

Эта команда используется для задержки выполнения программы или для выполнения команды в фоновом режиме в будущем. Она имеет несколько форм в зависимости от первого аргумента команды:
после мс
Мс должно быть целым числом, задающим время в миллисекундах. Команда ожидает мс миллисекунд, а затем возвращается. Пока команда ожидает, приложение не реагирует на события.
после мс ?скрипт скрипт скрипт ...?
В этой форме команда возвращается немедленно, но она организует выполнение команды Tcl через мс миллисекунд как обработчик события. Команда будет выполнена ровно один раз в указанное время. Отложенная команда формируется путём конкатенации всех аргументов скрипт таким же образом, как команда concat. Команда будет выполнена на глобальном уровне (вне контекста любой процедуры Tcl). Если при выполнении отложенной команды возникает ошибка, то ошибка в фоновом режиме будет сообщена командой, зарегистрированной с помощью interp bgerror. Команда после возвращает идентификатор, который может быть использован для отмены отложенной команды с помощью после отмена.
после отмена id
Отменяет выполнение отложенной команды, которая была ранее запланирована.Id указывает, какая команда должна быть отменена; она должна быть возвращённым значением предыдущей команды после. Если команда, указанная id, уже была выполнена, то команда после отмена не оказывает никакого влияния.
после отмена скрипт скрипт ...
Эта команда также отменяет выполнение отложенной команды. Аргументы скрипт конкатенируются с разделителями пробелов (точно так же, как в команде concat). Если есть ожидающая команда, которая соответствует строке, она отменяется и никогда не будет выполнена; если такая команда в настоящее время не ожидается, то команда после отмена не оказывает никакого влияния.
после в_простой скрипт ?скрипт скрипт ...?
Конкатенирует аргументы скрипт вместе с разделителями пробелов (точно так же, как в команде concat) и организует последующее вычисление получившегося скрипта как обратного вызова в режиме ожидания. Скрипт будет запущен ровно один раз, в следующий раз, когда цикл событий будет введён, и не будет событий для обработки. Команда возвращает идентификатор, который можно использовать для отмены отложенной команды с помощью после отмена. Если при выполнении скрипта возникает ошибка, то ошибка в фоновом режиме будет сообщена командой, зарегистрированной с помощью interp bgerror.
после информация ?id?
Эта команда возвращает информацию об имеющихся обработчиках событий. Если аргумент id не указан, команда возвращает список идентификаторов всех существующих обработчиков событий, созданных командой после для этого интерпретатора. Если id указан, он определяет существующий обработчик; id должен был быть возвращённым значением некоторого предыдущего вызова после, и он не должен был ещё сработать или быть отменён. В этом случае команда возвращает список из двух элементов. Первый элемент списка — это скрипт, связанный с id, а второй элемент — либо в_простой, либо таймер, чтобы указать, какой это тип обработчика событий.

Формы команд после мс и после в_простой предполагают, что приложение управляется событиями: отложенные команды не будут выполнены, если приложение не войдёт в цикл событий. В приложениях, которые обычно не управляются событиями, таких как tclsh, цикл событий можно войти с помощью команд vwait и update.

Примеры

Это определяет команду, чтобы Tcl ничего не делал N секунд:
proc sleep {N} {
    after [expr {int($N * 1000)}]
}

Это организует выполнение команды wake_up через восемь часов (при условии, что цикл событий активен в это время):

after [expr {1000 * 60 * 60 * 8}] wake_up

Следующая команда может быть использована для выполнения длительных вычислений (как представлено здесь ::my_calc::one_step, которое предполагается, что возвращает булево значение, указывающее, нужно ли выполнить ещё один шаг), пошагово, хотя само вычисление должно быть организовано так, чтобы оно могло работать пошагово. Эта техника особенно осторожна, чтобы убедиться, что цикл событий не голодает из-за повторного планирования шагов обработки (организуя следующий шаг для выполнения только тогда, когда очередь событий была опорожнена, используя уже сработавшее событие таймера) и полезна, когда вы хотите убедиться, что графический интерфейс Tk остаётся отзывчивым во время медленной задачи.

proc doOneStep {} {
    if {[::my_calc::one_step]} {
        after idle [list after 0 doOneStep]
    }
}
doOneStep

См. также

concat, interp, update, vwait

Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/after.htm

Licensed under Tcl/Tk terms
https://www.tcl.tk/man/tcl/TclCmd/after.htm

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API