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. Система сообщений GObject

Замыкания

PreviousСвойства объектаNextСигналы

Last updated 6 years ago

Was this helpful?

Замыкания являются центром концепции асинхронных сигналов, которая широко используется повсюду в GTK+ и GNOME приложениях. Замыкание - основное представление callback-функций. Это небольшая структура содержащая дерево объектов:

  • указатель функции (непосредственно сама callback-функция), чей прототип похож на:

    return_type function_callback (... , gpointer user_data);
  • Указатель user_data который помещается в callback-функцию при вызове замыкания

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

Структура представляет основную функциональность всех замкнутых реализаций: существуют разные реализации Замыканий для каждого отдельного рабочего цикла который хочет использовать систему типов GObject. [] Библиотека GObject обеспечивает простой тип который является определением реализации замыканий используемый с C/C++ callback-функциями.

представляет простые сервисы:

  • Вызов (): это то, для чего были созданы замыкания: они скрывают детали callback-вызовов из callback-вызовов.

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

C Замыкания

Если вы используете C или C++ для подключения callback-функции к данному событию, то вы будете использовать либо просто которая имеет довольно минимальный API, или ещё более простые функции (которые будут продемонстрированы немного позже :).

GClosure* g_cclosure_new (GCallback        callback_func,
                          gpointer         user_data,
                          GClosureNotify   destroy_data);
GClosure* g_cclosure_new_swap (GCallback        callback_func,
                               gpointer         user_data,
                               GClosureNotify   destroy_data);
GClosure* g_signal_type_cclosure_new (GType  itype,
                                      guint  struct_offset);

Не-C замыкания (для бесстрашных).

Как объяснялось выше, Замыкания скрывают подробности callback-вызовов. В C, callback-вызов такой же вызов функции: это просто вопрос создания правильного стека для вызова функции и выполнения трансляции команды вызова.

'C' маршаллеры замыканий преобразуют массив GValues, который представляет параметры целевой функции, в список параметров функций в C-стиле, вызывая предоставленную пользователем C функцию с этим списком параметров, получают возвращаемое значение функции, преобразуют его в GValue и возвращают это GValue в вызывающую программу.

Следующий код реализует простой маршаллер в C для C функции которая принимает целочисленное как первый параметр и ничего не возвращает.

g_cclosure_marshal_VOID__INT (GClosure     *closure,
                              GValue       *return_value,
                              guint         n_param_values,
                              const GValue *param_values,
                              gpointer      invocation_hint,
                              gpointer      marshal_data)
{
  typedef void (*GMarshalFunc_VOID__INT) (gpointer     data1,
                                          gint         arg_1,
                                          gpointer     data2);
  register GMarshalFunc_VOID__INT callback;
  register GCClosure *cc = (GCClosure*) closure;
  register gpointer data1, data2;

  g_return_if_fail (n_param_values == 2);

  data1 = g_value_peek_pointer (param_values + 0);
  data2 = closure->data;

  callback = (GMarshalFunc_VOID__INT) (marshal_data ? marshal_data : cc->callback);

  callback (data1,
            g_marshal_value_peek_int (param_values + 1),
            data2);
}

Конечно, существуют другие виды маршаллеров. Например, James Henstridge написал родной для Python маршаллер который используется всеми замыканиями языка python (замыкания python используются python-based callback-функциями вызываемыми процессом запрса замыкания). Этот python маршаллер преобразует введённый список GValue представляющий параметры функции в эквивалентную структурную запись Python (вы можете посмотреть pyg_closure_marshal вpygtype.c в модуле pygobject GNOME cvs server).

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

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

[] На практике, Замыкания находятся в границах языкового окружения: если вы пишите код на python и один из ваших Python callback-вызовов получает сигнал одного из виджетов GTK+, код на C в GTK+ должен выполнить ваш код на Python. Замыкание вызывающее GTK+ object вызывает Python callback-вызов: он ведёт себя как обычный C object для GTK+ и как обычный Python object для python кода.

[] Замыкания подсчитывают ссылки и уведомляют слушателя относительно своего уничтожения в два этапа: уведомление аннулирования вызывается перед уведомлением финализации.

GClosure
8
GCClosure
GClosure
g_closure_invoke
g_closure_add_finalize_notifier
g_closure_add_invalidate_notifier
g_closure_add_marshal_guards
g_closure_remove_finalize_notifier
g_closure_remove_invalidate_notifier
9
GCClosure
g_signal_connect
g_cclosure_new
g_cclosure_new_swap
g_cclosure_new
8
9