GLib
  • Initial page
  • I. Концепция
    • Background
    • Типы данных и программирование
  • Динамическая система типов Glib
    • Введение
    • Функции копирования
    • Соглашения
    • Неинстанциируемые не классифицированные базовые типы
    • Инстанциируемые классифицируемые типы: объекты
    • Неинстанциированные классифицированные типы: Интерфейсы.
  • Основной класс GObject
    • Введение
    • Инстанциация объекта
    • Объектное управление памятью
    • Свойства объекта
  • Система сообщений GObject
    • Замыкания
    • Сигналы
  • II. Описание API
    • GType
    • GTypePlugin
    • GTypeModule
    • GObject часть 1
    • GObject часть 2
    • Enums and Flags
    • GBoxed
    • Generic Values
    • Parameters and Values часть 1
    • Parameters and Values часть 2
    • Parameters and Values часть 3, ага
    • Value arrays
  • III. Описание инструментов
    • glib-mkenums
    • glib-genmarshal
    • gobject-query
  • IV. Руководство
    • Как определить и реализовать новый GObject?
    • Объектные методы
    • Как определять и реализовывать Интерфейсы?
    • Как создавать и использовать сигналы
    • Как пользователи могут злоупотреблять сигналами (и почему некоторые думают что это хорошо)
  • V. Об инструментах
    • Об инструментах
  • GTK 4
    • GtkApplication и GtkApplicationWindow
    • Widgets
Powered by GitBook
On this page

Was this helpful?

  1. IV. Руководство

Как пользователи могут злоупотреблять сигналами (и почему некоторые думают что это хорошо)

PreviousКак создавать и использовать сигналыNextОб инструментах

Last updated 6 years ago

Was this helpful?

Теперь когда вы знаете как создавать сигналы которые пользователь может легко подключать в любой точке эмиссии сигнала благодаря , и G_SIGNAL_RUN_LAST, пришло время изучить как ваши пользователи могут заморочить вас. Это интересно, чтобы знать как вы сами можете заморочить других людей. Что заставит вас чувствовать себя хорошо.

Пользователи могут:

  • остановить эмиссию сигнала в любое время

  • переписать обработчик по умолчанию для сигнала если он сохранён как функция указанная в структуре класса (которая является предпочтительным способом создания обработчика по умолчанию что обсуждалось в предыдущем разделе).

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

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

Если по умолчанию обработчик сигнала является просто указателем классовой функции, возможно переписать его самостоятельно из типовой функции class_init которая унаследована у родителя. В этом случае, когда издаётся сигнал, родительский класс будет использовать функцию обеспеченную потомком как обработчик сигнала по умолчанию. Конечно, также возможно (и рекомендуется) соединять потомка с родительским обработчиком сигнала по умолчанию гарантируя целостность родительского объекта.

Перезапись классового метода и формирование цепочек было продемонстрировано в поэтому я не стану показывать здесь как это делается снова.

g_signal_connect
g_signal_connect_after
“Object methods”