Часть 56. Таймеры, ввод/вывод и функции ожидания(idle)

Содержание
56.1. Таймеры
56.2. Контролирование ввода/вывода
56.3. Функции ожидания(idle)

56.1. Timouts

Вам может показаться интересным, как вы можете заставить GTK выполнять полезную работу при вызове main Gtk. Для этого у Вас есть несколько возможностей. Используя приведенную функцию, вы можете создавать функцию задержки, которая будет периодически вызываться.

$timer = Gtk->timeout_add( $interval, \&function, @function_data );

Первый аргумент - интервал (в миллисекундах) между вызовами вашей функции. Второй аргумент - функция, которую вы хотите авызвать и третий - данные для вызываемой функции. Возвращаемое значение - число, которое может быть использовано для остановки задержки при помощи

Gtk->timeout_remove( $timer );

Вы также можете остановить функцию задержки возвращая ложное значение из вызываемой вами функции, в противном случае - истинное.

Объявление вашего вызова должно быть похожим на нечто такое:

sub timeout_callback
  {
    my ( @data ) = @_;
    ...
}

56.2. Контроль ввода/вывода

Изящная особенность GDK (библиотеки, лежащей в основе GTK) - способность контролировать данные в файловых дескрипторах (возвращаемых функциями open() или socket()). Эта возможность моет быть полезной для сетевых приложений. Функция

$id = Gtk::Gdk->input_add( $source, $condition, \&function, @data );

берет файловый декриптор первым аргументом, а вторым аргументом можно задать то, что необходимо контролировать с помощью GDK Возможные варианты:

Я уверен, что Вы уже поняли, что третий аргумент - фукнция, которую необходимо вызвать, а четвертый - данные для этой функции.

Возвращаемое значение - некое значение, которое может быть использовано для остановки контроля файлового дескриптора например при помощи такой функции:

Gtk::Gdk->input_remove( $id );

Вызов функции может быть определен например так:

sub input_callback
  {
    my ( $source, $condition, @data ) = @_;
    ...
  }

для которой источник и условие срабатывания были определены ранее

56.3. Idle Functions

Что если Вы имеете некоторую функцию, которую бы вам хотелось вызываеть в случае, когда ничего не происходит?

$idle = Gtk->idle_add( \&function, @data );

Этот вызов GTK происходит, в случае например, холостой работы (м.б. что-то в данных не прошло по всем условиям), Чтобы убрать этот вызов - необходимо написать так:

Gtk->idle_remove( $idle );

Объяснять значения аргументов я не буду, т.к. они очень сильно похожи на описанные выше. Соответственно по срабатыванию данного условия вызывается функция function. Ложное значение будет прерывать выполнение idle_add()