'\" '\" Copyright (c) 2025 The TCL Association '\" '\" See the file "license.terms" for information on usage and redistribution '\" of this file, and for a DISCLAIMER OF ALL WARRANTIES. '\" .TH timer n 9.1 Tcl "Tcl Built-In Commands" .\" The -*- nroff -*- definitions below are for supplemental macros used .\" in Tcl/Tk manual entries. .\" .\" .AP type name in/out ?indent? .\" Start paragraph describing an argument to a library procedure. .\" type is type of argument (int, etc.), in/out is either "in", "out", .\" or "in/out" to describe whether procedure reads or modifies arg, .\" and indent is equivalent to second arg of .IP (shouldn't ever be .\" needed; use .AS below instead) .\" .\" .AS ?type? ?name? .\" Give maximum sizes of arguments for setting tab stops. Type and .\" name are examples of largest possible arguments that will be passed .\" to .AP later. If args are omitted, default tab stops are used. .\" .\" .BS .\" Start box enclosure. From here until next .BE, everything will be .\" enclosed in one large box. .\" .\" .BE .\" End of box enclosure. .\" .\" .CS .\" Begin code excerpt. .\" .\" .CE .\" End code excerpt. .\" .\" .VS ?version? ?br? .\" Begin vertical sidebar, for use in marking newly-changed parts .\" of man pages. The first argument is ignored and used for recording .\" the version when the .VS was added, so that the sidebars can be .\" found and removed when they reach a certain age. If another argument .\" is present, then a line break is forced before starting the sidebar. .\" .\" .VE .\" End of vertical sidebar. .\" .\" .DS .\" Begin an indented unfilled display. .\" .\" .DE .\" End of indented unfilled display. .\" .\" .SO ?manpage? .\" Start of list of standard options for a Tk widget. The manpage .\" argument defines where to look up the standard options; if .\" omitted, defaults to "options". The options follow on successive .\" lines, in three columns separated by tabs. .\" .\" .SE .\" End of list of standard options for a Tk widget. .\" .\" .OP cmdName dbName dbClass .\" Start of description of a specific option. cmdName gives the .\" option's name as specified in the class command, dbName gives .\" the option's name in the option database, and dbClass gives .\" the option's class in the option database. .\" .\" .UL arg1 arg2 .\" Print arg1 underlined, then print arg2 normally. .\" .\" .QW arg1 ?arg2? .\" Print arg1 in quotes, then arg2 normally (for trailing punctuation). .\" .\" .PQ arg1 ?arg2? .\" Print an open parenthesis, arg1 in quotes, then arg2 normally .\" (for trailing punctuation) and then a closing parenthesis. .\" .\" # Set up traps and other miscellaneous stuff for Tcl/Tk man pages. .if t .wh -1.3i ^B .nr ^l \n(.l .ad b .\" # Start an argument description .de AP .ie !"\\$4"" .TP \\$4 .el \{\ . ie !"\\$2"" .TP \\n()Cu . el .TP 15 .\} .ta \\n()Au \\n()Bu .ie !"\\$3"" \{\ \&\\$1 \\fI\\$2\\fP (\\$3) .\".b .\} .el \{\ .br .ie !"\\$2"" \{\ \&\\$1 \\fI\\$2\\fP .\} .el \{\ \&\\fI\\$1\\fP .\} .\} .. .\" # define tabbing values for .AP .de AS .nr )A 10n .if !"\\$1"" .nr )A \\w'\\$1'u+3n .nr )B \\n()Au+15n .\" .if !"\\$2"" .nr )B \\w'\\$2'u+\\n()Au+3n .nr )C \\n()Bu+\\w'(in/out)'u+2n .. .AS Tcl_Interp Tcl_CreateInterp in/out .\" # BS - start boxed text .\" # ^y = starting y location .\" # ^b = 1 .de BS .br .mk ^y .nr ^b 1u .if n .nf .if n .ti 0 .if n \l'\\n(.lu\(ul' .if n .fi .. .\" # BE - end boxed text (draw box now) .de BE .nf .ti 0 .mk ^t .ie n \l'\\n(^lu\(ul' .el \{\ .\" Draw four-sided box normally, but don't draw top of .\" box if the box started on an earlier page. .ie !\\n(^b-1 \{\ \h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul' .\} .el \}\ \h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\l'|0u-1.5n\(ul' .\} .\} .fi .br .nr ^b 0 .. .\" # VS - start vertical sidebar .\" # ^Y = starting y location .\" # ^v = 1 (for troff; for nroff this doesn't matter) .de VS .if !"\\$2"" .br .mk ^Y .ie n 'mc \s12\(br\s0 .el .nr ^v 1u .. .\" # VE - end of vertical sidebar .de VE .ie n 'mc .el \{\ .ev 2 .nf .ti 0 .mk ^t \h'|\\n(^lu+3n'\L'|\\n(^Yu-1v\(bv'\v'\\n(^tu+1v-\\n(^Yu'\h'-|\\n(^lu+3n' .sp -1 .fi .ev .\} .nr ^v 0 .. .\" # Special macro to handle page bottom: finish off current .\" # box/sidebar if in box/sidebar mode, then invoked standard .\" # page bottom macro. .de ^B .ev 2 'ti 0 'nf .mk ^t .if \\n(^b \{\ .\" Draw three-sided box if this is the box's first page, .\" draw two sides but no top otherwise. .ie !\\n(^b-1 \h'-1.5n'\L'|\\n(^yu-1v'\l'\\n(^lu+3n\(ul'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c .el \h'-1.5n'\L'|\\n(^yu-1v'\h'\\n(^lu+3n'\L'\\n(^tu+1v-\\n(^yu'\h'|0u'\c .\} .if \\n(^v \{\ .nr ^x \\n(^tu+1v-\\n(^Yu \kx\h'-\\nxu'\h'|\\n(^lu+3n'\ky\L'-\\n(^xu'\v'\\n(^xu'\h'|0u'\c .\} .bp 'fi .ev .if \\n(^b \{\ .mk ^y .nr ^b 2 .\} .if \\n(^v \{\ .mk ^Y .\} .. .\" # DS - begin display .de DS .RS .nf .sp .. .\" # DE - end display .de DE .fi .RE .sp .. .\" # SO - start of list of standard options .de SO 'ie '\\$1'' .ds So \\fBoptions\\fR 'el .ds So \\fB\\$1\\fR .SH "STANDARD OPTIONS" .LP .nf .ta 5.5c 11c .ft B .. .\" # SE - end of list of standard options .de SE .fi .ft R .LP See the \\*(So manual entry for details on the standard options. .. .\" # OP - start of full description for a single option .de OP .LP .nf .ta 4c Command-Line Name: \\fB\\$1\\fR Database Name: \\fB\\$2\\fR Database Class: \\fB\\$3\\fR .fi .IP .. .\" # CS - begin code excerpt .de CS .RS .nf .ta .25i .5i .75i 1i .. .\" # CE - end code excerpt .de CE .fi .RE .. .\" # UL - underline word .de UL \\$1\l'|0\(ul'\\$2 .. .\" # QW - apply quotation marks to word .de QW .ie '\\*(lq'"' ``\\$1''\\$2 .\"" fix emacs highlighting .el \\*(lq\\$1\\*(rq\\$2 .. .\" # PQ - apply parens and quotation marks to word .de PQ .ie '\\*(lq'"' (``\\$1''\\$2)\\$3 .\"" fix emacs highlighting .el (\\*(lq\\$1\\*(rq\\$2)\\$3 .. .\" # QR - quoted range .de QR .ie '\\*(lq'"' ``\\$1''\\-``\\$2''\\$3 .\"" fix emacs highlighting .el \\*(lq\\$1\\*(rq\\-\\*(lq\\$2\\*(rq\\$3 .. .\" # MT - "empty" string .de MT .QW "" .. .BS '\" Note: do not modify the .SH NAME line immediately below! .SH NAME timer \- timer events for monotonic and wall clock time .SH SYNOPSIS .nf \fBtimer in\fR \fIdelay\fR \fIunit\fR \fIscript\fR \fBtimer at\fR \fItimepoint\fR \fIunit\fR \fIscript\fR \fBtimer idle\fR \fIscript\fR \fBtimer sleep for\fR \fIdelay\fR ?\fIunit\fR? \fBtimer sleep until\fR \fItimepoint\fR ?\fIunit\fR? \fBtimer cancel\fR \fIid\fR \fBtimer info\fR ?\fIid\fR? .fi .BE .SH DESCRIPTION .PP This command is used to delay execution of the program or to execute a command in the background sometime in the future. Time may be specified by a monotonic time delay or by wall clock time point. It has the following methods: .\" METHOD: in .TP \fBtimer in\fR \fIdelay\fR \fIunit\fR \fIscript\fR . In this form the command returns immediately, but it arranges for a Tcl command to be executed after the given monotonic time \fIdelay\fR elapsed as an event handler. The \fIdelay\fR value is given in the specified \fIunit\fR. See \fBTIME UNITS\fR below for available units. The command will be executed exactly once, after the given time delay. The delayed command is given by the argument \fIscript\fR. The command will be executed at global level (outside the context of any Tcl procedure). If an error occurs while executing the delayed command then the background error will be reported by the command registered with \fBinterp bgerror\fR. The command returns an identifier that can be used to cancel the delayed command using \fBtimer cancel\fR or \fBafter cancel\fR. A \fIdelay\fR value of 0 (or negative) queues the event immediately with priority over other event types (if not installed with an event proc, which will wait for next round of events). .RS .PP The command \fBafter ms script\fR may also be used to register monotonic clock timer events. They are handled by the same queue as this form of the \fBtimer\fR command. .RE .\" METHOD: at .TP \fBtimer at \fItimepoint\fR \fIunit\fR \fIscript\fR . Same as \fBtimer in\fR, but specifying a wall clock time point (epoc). A typical use-case is to pass result of a \fBclock scan\fR as time point. See example below. .RS .PP Wall clock events have second priority after monotonic clock events. If both fire the same instant, the monotonic clock command is always handled first. .RE .\" METHOD: idle .TP \fBtimer idle \fIscript\fR . Arranges for the \fIscript\fR to be evaluated later as an idle callback. The script will be run exactly once, the next time the event loop is entered and there are no events to process. The command returns an identifier that can be used to cancel the delayed command using \fBtimer cancel\fR or \fBafter cancel\fR. If an error occurs while executing the script then the background error will be reported by the command registered with \fBinterp bgerror\fR. .\" METHOD: sleep for .TP \fBtimer sleep for \fIdelay\fR ?\fIunit\fR? \fIdelay\fR must be a wide integer giving a time in the given unit (default: \fBmilliseconds\fR). A negative number is treated as 0. The command sleeps for the given monotonic delay and then returns. While the command is sleeping the application does not respond to events. .\" METHOD: sleep until .TP \fBtimer sleep until \fItimepoint\fR ?\fIunit\fR? \fItimepoint\fR must be a wide integer giving a wall clock time point in the given unit (default: \fBseconds\fR). A negative number is treated as 0. The command sleeps (at least) until the given wall clock time point and then returns. While the command is sleeping the application does not respond to events. .\" METHOD: cancel .TP \fBafter cancel \fIid\fR . Cancels the execution of a delayed command that was previously scheduled. \fIId\fR indicates which command should be canceled; it must have been the return value from a previous \fBtimer\fR or \fBafter\fR command. If the command given by \fIid\fR has already been executed then the \fBtimer cancel\fR command has no effect. .\" METHOD: info .TP \fBtimer info \fR?\fIid\fR? . This command returns information about existing event handlers. If no \fIid\fR argument is supplied, the command returns a list of the identifiers for all existing event handlers created by the \fBtimer\fR and \fBafter\fR command for this interpreter. If \fIid\fR is supplied, it specifies an existing handler; \fIid\fR must have been the return value from some previous call to \fBtimer\fR or \fBafter\fR and it must not have triggered yet or been canceled. In this case the command returns a list with two to three elements. The first element of the list is the script associated with \fIid\fR, and the second element is either \fBidle\fR, \fBmonotonic\fR or \fBwallclock\fR to indicate what kind of event handler it is. A third list element is present for the kinds \fB monotonic\fR or \fBwallclock\fR. This element is the scheduled execution time point in microseconds of the given clock type. .LP The \fBtimer in\fR, \fBtimer at\fR and \fBtimer idle\fR forms of the command assume that the application is event driven: the delayed commands will not be executed unless the application enters the event loop. In applications that are not normally event-driven, such as \fBtclsh\fR, the event loop can be entered with the \fBvwait\fR and \fBupdate\fR commands. .LP Note that the output differs from \fBafter info\fR. .SH "TIME UNITS" Some forms of the command take a time unit. Available units are: \fBus\fR (for microseconds), \fBmicroseconds\fR, \fBms\fR (for milliseconds), \fBmilliseconds\fR, \fBs\fR (for seconds), \fBseconds\fR or any unique abbreviation. .SH "TIME MAXIMUM VALUE" The arguments \fIdelay\fR and \fItimepoint\fR are bound to a resulting 63 bit clock value (in unit microseconds). Any higher value (which is after year 294441) will result in a \fBtime too far away\fR error. .SH "EXAMPLES" This arranges for the command \fIwake_up\fR to be run in eight hours wall clock time (providing the event loop is active at that time): .PP .CS \fBtimer at\fR [\fBclock add\fR [\fBclock seconds\fR] 8 hours] seconds wake_up .CE .PP .SH "SEE ALSO" concat(n), interp(n), timer(n), update(n), vwait(n) .SH KEYWORDS cancel, delay, idle callback, sleep, time '\" Local Variables: '\" mode: nroff '\" End: