Библиотека сайта 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 г.
Перевод: А.Панин
Дата перевода: 25 Апреля 2014 г.
Приложение D. Сравнение со сторонними системами обработки сигналов
Дополнительная информация: в рамках GTK+ система обработки сигналов называется "системой сигнализирования" ("signalling"); наблюдательный читатель, обладающий опытом работы с GTK+, может заметить, что эта система спроектирована точно так же, как и система, которая носит имя "вещатель-обработчик" ("broadcaster-listener") (т.е., система, лежащая в основе фреймворка PowerPlant от Metrowerks для платформы Macintosh). При этом она функционирует практически также: сначала настраиваются вещатели (broadcasters
), после чего к ним присоединяются обработчики (listeners
); вещатель хранит список объектов, которые обрабатывают его команды и в момент, когда кто-либо передает ему сообщение, он вызывает методы всех объектов из списка, передавая принятое сообщение. Можно сказать, что в gtkmm объекты сигналов играют роль вещателей, а слоты - обработчиков. Подробнее об этом будет сказано далее.)
В gtkmm обработчики сигналов строго типизируются, в то время, как при работе с GTK+ язык программирования C позволяет вам установить обработчик сигнала с некорректным количеством и типами аргументов, что может привести к ошибке сегментирования в ходе исполнения программы. При этом gtkmm, в отличие от Qt, предоставляет возможность использования типизированных обработчиков сигналов без модификации языка программирования C++.
Повторимся насчет перекрытия обработчиков сигналов: вы также можете выполнять эту операцию и при использовании исключительно языка программирования C в ходе работы с GTK+; именно для этого и предназначена система объектов GTK. Но при работе с GTK+ вам придется выполнить некоторые запутанные процедуры для того, чтобы воспользоваться такими возможностями объектно-ориентированного программирования, как наследование и перегрузка. При использовании языка программирования C++ это делается достаточно просто, так как данные возможности поддерживаются самим языком программирования; вы можете переложить всю грязную работу на плечи компилятора.
Это одна из областей, в которой становится очевидной красота языка программирования C++. Никто не будет задумываться о создании подкласса класса виджета GTK+ исключительно для перекрытия его основного метода; это слишком сложно. В GTK+ вам приходится практически всегда использовать сигналы для решения поставленных задач за исключением тех случаев, когда вы разрабатываете новый виджет. Но, ввиду того, что перекрытие методов в C++ выполняется настолько просто, создание подкласса класса кнопки для перекрытия его метода становится вполне практичным и разумным действием.
Следующий раздел : Приложение E. Работа с gtkmm на платформе Win32.