projman/hlp/ru/tcl/fileevent.html
2018-02-05 17:23:37 +03:00

109 lines
8.2 KiB
HTML
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

<!DOCTYPE HTML PUBLIC -//W3C//DTD HTML 4.01 Transitional//EN>
<html>
<head>
<title>fileevent</title>
</head>
<body>
<h1>fileevent</h1>
<p> Исполняет скрипт, когда канал открывается на чтение или
запись. </p>
<pre>
<strong>fileevent</strong> <em>channelId</em> <strong>readable</strong> ?<em>script</em>?
<strong>fileevent</strong> <em>channelId</em> <strong>writable</strong> ?<em>script</em>?
</pre>
<h2>ОПИСАНИЕ</h2>
<p> Эта команда используется для создания обработчиков файловых
событий. Обработчик файловых событий связывает канал и скрипт
таким образом, что скрипт исполняется, когда канал открывается
на чтение или запись. Обработчики файловых событий используются,
чтобы получение данных от другого процесса управлялось
событиями. При этом получающий процесс, ожидая поступление
данных, сможет продолжать взаимодействовать с
пользователем. Если приложение выполняет команду <a
href=gets.html>gets</a> или <a
href=read.html><strong>read</strong></a> из блокирующего канала, оно
не способно обслуживать другие события, поэтому оно кажется
пользователю &quot;замороженным&quot;. С использованием файловых
событий процесс обратится к команде <a
href=gets.htm><strong>gets</strong></a> или <a
href=read.html><strong>read</strong></a> только когда информация
поступит в канал.
</p>
<p> Аргумент <em>channelId</em> должен быть идентификатором
открытого канала, который вернула предыдущая команда <a
href=open.html><strong>open</strong></a> или <a href=
socket.html><strong>socket</strong></a>. Если в команде присутствует
аргумент <em>script</em>, команда создает новый обработчик
событий: скрипт <em>script</em> будет выполнен, когда канал
<em>channelId</em> откроется на чтение или запись (в зависимости
от второго аргумента команды). В такой форме команда возвращает
пустую строку. Обработчики для обработки открытия файла на
чтение или запись соответственно независимы и могут создаваться
и удаляться по одному, независимо один от другого. Однако для
каждого из событий может быть только один обработчик, так что
если команда <strong>fileevent</strong> выполняется, когда соответствующий
обработчик (в текущем интерпретаторе) уже задан, новый скрипт
заменит старый.
</p>
<p> Если аргумент <em>script</em> не задан, команда <strong>fileevent</strong>
возвратит скрипт, заданный для данного события для канала
<em>channelId</em>, или пустую строку, если скрипт не
задан. Обработчик событий удаляется автоматически при закрытии
канала или удалении интерпретатора.
</p>
<p> Канал считается открытым на чтение, если на соответствующем
устройстве есть непрочитанные данные. Также канал считается
открытым на чтение, если есть непрочитанные данные во входном
буфере, кроме того случая, когда команда <a
href=gets.htm><strong>gets</strong></a> не смогла найти в буфере
законченную строку. Эта особенность позволяет читать файл
построчно в неблокирующем режиме, используя обработчик
событий. Канал также считается открытым на чтение, если
достигнут конец соответствующего файла или на соответствующем
устройстве сгенерирована ошибка. Поэтому скрипт должен уметь
распознавать и корректно обрабатывать такие ситуации, чтобы не
возникало зацикливаний, когда скрипт не может прочитать данные,
завершается и тут же вызывается вновь.
</p>
<p> Канал считается открытым на запись, если по крайней мере один
байт данных может быть записан в соответствующий файл или
передан на соответствующее устройство, или на устройстве (в
файле) сгенерирована ошибка.
</p>
<p> Событийно управляемый ввод - вывод лучше всего работает с
каналами, переведенными в неблокирующий режим с помощью команды
<a href=fconfigure.html><strong>fconfigure</strong></a>. В
блокирующем режиме команды <a
href=puts.html><strong>puts</strong></a>, <a
href=gets.html><strong>gets</strong></a> или <a
href=read.html><strong>read</strong></a> могут заблокировать
процесс, если они не могут быть выполнены сразу (например, при
попытке прочитать больше данных, чем доступно в настоящий
момент). При этом никакой обработки событий не происходит. В
неблокирующем режиме команды <a href=
puts.html><strong>puts</strong></a>, <a href=
gets.html><strong>gets</strong></a> или <a
href=read.html><strong>read</strong></a> никогда не блокируют
процесс. Детальное описание работы команд с блокирующими и
неблокирующими каналами приведено в описаниях соответствующих
команд.
</p>
<p> Скрипт обработчика файловых событий выполняется на самом
верхнем уровне вне контекста какой-либо процедуры в
интерпретаторе, в котором обработчик событий был задан. Если при
исполнении скрипта происходит ошибка, сообщение о ней выдается с
помощью процедуры <a href=
bgerror.html><strong>bgerror</strong></a>. Кроме того, при ошибке
соответствующий обработчик событий удаляется. Это делается для
того, чтобы избежать зацикливания из-за ошибок в обработчике.
</p>
</body>
</html>