Библиотека сайта rus-linux.net
Программирование с использованием gtkmm 3. Функции с временем ожидания, мониторинг операций ввода/вывода и функции для периодов бездействия
Оригинал: Programming with gtkmm 3Авторы: Murray Cumming, Bernhard Rieder, Jonathon Jongsma, Ole Laursen, Marko Anastasov, Daniel Elstner, Chris Vine, David King, Pedro Ferreira, Kjell Ahlstedt
Дата публикации: 15 Октября 2013 г.
Перевод: А.Панин
Дата перевода: 28 марта 2014 г.
24. Функции с временем ожидания, мониторинг операций ввода/вывода и функции для периодов бездействия
24.1. Функции с временем ожидания
sigc::connection Glib::SignalTimeout::connect(const sigc::slot<bool>& slot, unsigned int interval, int priority = Glib::PRIORITY_DEFAULT);
sigc::connection, который может быть использован для деактивации соединения с вызываемым методом с помощью метода disconnect().
my_connection.disconnect();
sigc::slot<bool>. Как вы видите в объявлении метода, ваш обработчик сигналов должен возвращать логическое значение. Объявление вызываемого метода должно выглядеть аналогичным образом:
bool MyCallback() { std::cout << "Hello World!\n" << std::endl; return true; }
Вы можете прекратить использование вызываемого метода, вернув логическое значение false из вашего обработчика сигналов. Следовательно, если вы хотите, чтобы ваш метод вызывался повторно, вы должны возвращать логическое значение true.
Ниже приведен пример использования описанной техники.
Файл: timerexample.h (Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл: timerexample.cc (Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл: main.cc (Для использования совместно с gtkmm 3, а не с gtkmm 2)
24.2. Мониторинг операций ввода/вывода
sigc::connection Glib::SignalInput::connect(const sigc::slot<bool,Glib::IOCondition>& slot,
int fd, Glib::IOCondition condition,
int priority = Glib::PRIORITY_DEFAULT);
|):
Glib::IO_IN- Ваш метод будет вызван тогда, когда данные будут доступны для чтения из вашего файлового дескриптора.Glib::IO_OUT- Ваш метод будет вызван тогда, когда файловый дескриптор будет готов для записи.Glib::IO_PRI- Ваш метод будет вызван тогда, когда для чтения из файлового дескриптора будут доступны важные данные.Glib::IO_ERR- Ваш метод будет вызван тогда, когда при работе с файловым дескриптором произойдет ошибка.Glib::IO_HUP- Ваш метод будет вызван тогда, когда произойдет разрыв соединения (соединение, обычно создаваемое с использованием каналов или сокетов, будет нарушено).
sigc::connection, который может использоваться для прекращения мониторинга данного файлового дескриптора путем вызова метода disconnect(). Обработчик сигналов для используемого слота должен быть объявлен следующим образом:
bool input_callback(Glib::IOCondition condition);
причем для аргумента condition используются описанные выше флаги. Как обычно, слот создается с помощью вызова sigc::mem_fun() (для метода класса) или вызова sigc::ptr_fun() (для функции).
Ниже приведен небольшой пример. Для использования этого примера просто запустите скомпилированное приложение из терминала; оно не создает окон. Данное приложение создаст именованный канал с именем testfifo в текущей директории. После запуска откройте еще один терминал и выполните команду "Hello" > testinfo. Приложение будет выводить каждую переданную вами строку до того момента, пока вы не выполните команду echo "Q" > testfifo.
Файл: main.cc (Для использования совместно с gtkmm 3, а не с gtkmm 2)
24.3. Функции для периодов бездействия
sigc::connection Glib::SignalIdle::connect(const sigc::slot<bool>& slot, int priority = Glib::PRIORITY_DEFAULT_IDLE);
disconnect() объекта идентификации соединения типа sigc::connection или возврат логического значения false из обработчика сигналов, который должен быть объявлен следующим образом:
bool idleFunc();
Так как данный метод практически полностью аналогичен описанным ранее методам, данных пояснений должно быть вполне достаточно для понимания методики его использования. Однако, ниже приведен небольшой пример:
Файл: idleexample.h (Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл: idleexample.cc (Для использования совместно с gtkmm 3, а не с gtkmm 2)
Файл: main.cc (Для использования совместно с gtkmm 3, а не с gtkmm 2)
Приведенный пример демонстрирует небольшое различие между методами с временем ожидания и методами периодов бездействия. Если вам требуются методы, которые вызываются периодически и скорость не очень важна, то вам подойдут методы с временем ожидания. Если же вам требуются методы, которые вызываются так часто, как это возможно (для выполнения таких задач, как расчет фрактала в фоновом режиме), вам следует использовать методы для периодов бездействия.
Попробуйте запустить данный пример и повысить нагрузку на систему. Верхний индикатор степени выполнения задачи будет изменять свое значение с такой же скоростью, а нижний - в замедленном темпе.
Следующий раздел : Управление памятью.
