| |
| Справочное описание GObject | ||||
|---|---|---|---|---|
#include <glib-object.h>
GTypePlugin;
GTypePluginClass;
void (*GTypePluginUse) (GTypePlugin *plugin);
void (*GTypePluginUnuse) (GTypePlugin *plugin);
void (*GTypePluginCompleteTypeInfo) (GTypePlugin *plugin,
GType g_type,
GTypeInfo *info,
GTypeValueTable *value_table);
void (*GTypePluginCompleteInterfaceInfo) (GTypePlugin *plugin,
GType instance_type,
GType interface_type,
GInterfaceInfo *info);
void g_type_plugin_use (GTypePlugin *plugin);
void g_type_plugin_unuse (GTypePlugin *plugin);
void g_type_plugin_complete_type_info (GTypePlugin *plugin,
GType g_type,
GTypeInfo *info,
GTypeValueTable *value_table);
void g_type_plugin_complete_interface_info
(GTypePlugin *plugin,
GType instance_type,
GType interface_type,
GInterfaceInfo *info);
Система типов GObject поддерживает динамическую загрузку типов. Интерфейс GTypePlugin используется для обработки жизненного цикла динамически загружаемых типов. Это происходит следующим образом:
Сначала тип внедряется (обычно после загрузки модуля в первый раз, или вашим основным приложением,
которое знает какие модули внедряют какие типы), например:
new_type_id = g_type_register_dynamic (parent_type_id,
"TypeName",
new_type_plugin,
type_flags);
где new_type_plugin это реализация интерфейса
GTypePlugin.
На реализованный тип создаётся ссылка, например через
g_type_class_ref() или через
g_type_create_instance()
(вызывается функцией g_object_new())
или как описано выше выполняя наследование типа из new_type_id.
Это заставит систему типов загрузить реализацию типа вызвав
g_type_plugin_use() и
g_type_plugin_complete_type_info() для
new_type_plugin.
В некоторой точке реализация типа больше не требуется, например после
g_type_class_unref() или
g_type_free_instance()
(вызывается когда количество ссылок экземпляра сброшено до нуля).
Это заставит систему типов сбросить информацию найденную с помощью
g_type_plugin_complete_type_info()
и зтем вызвать
g_type_plugin_unuse() для
new_type_plugin.
Цикл может повторятся от второго шага.
В основном вы должны реализовать GTypePlugin тип
который несёт use_count, как только use_count станет единицей, вы должны загрузить реализацию для успешной обработки наступающего вызова
g_type_plugin_complete_type_info().
Позже, возможно после последующих использованных/неиспользованных вызовов, как только use_count сброшен до 0, вы можете выгрузить реализацию
снова. Система типов гарантированно вызовет
g_type_plugin_use() и
g_type_plugin_complete_type_info() снова
когда тип потребуется опять.
GTypeModule это реализация GTypePlugin в которой уже реализованы большинство необходимого для фактической загрузки или выгрузки модуля. Это даже обрабатывает многократную регистрацию типов в модуле.
typedef struct _GTypePlugin GTypePlugin;
Декларация типа GTypePlugin используется как метка для объектов которые реализуют интерфейс GTypePlugin.
typedef struct {
GTypePluginUse use_plugin;
GTypePluginUnuse unuse_plugin;
GTypePluginCompleteTypeInfo complete_type_info;
GTypePluginCompleteInterfaceInfo complete_interface_info;
} GTypePluginClass;
Интерфейс GTypePlugin используется системой типов для обработки жизненного цикла динамически загружаемых типов.
GTypePluginUse use_plugin; |
Увеличивает количество используемых plugin. |
GTypePluginUnuse unuse_plugin; |
Уменьшает количество используемых plugin. |
GTypePluginCompleteTypeInfo complete_type_info; |
Заполняет сструктуры GTypeInfo и
GTypeValueTable для типа.
Сструктуры инициализируются с помощью memset(s, 0, sizeof (s)) перед вызовом этой функции.
|
GTypePluginCompleteInterfaceInfo complete_interface_info; |
Заполняет недостающие части GInterfaceInfo
для интерфейса. Сструктуры инициализируются с помощью memset(s, 0, sizeof (s)) перед вызовом этой
функции.
|
void (*GTypePluginUse) (GTypePlugin *plugin);
Тип use_plugin функции
GTypePluginClass, которая вызывается для увеличения
используемого количества plugin.
plugin : |
GTypePlugin чьё используемое количество должно быть увеличено |
void (*GTypePluginUnuse) (GTypePlugin *plugin);
Тип unuse_plugin функции GTypePluginClass.
plugin : |
GTypePlugin чьё используемое количество должно быть уменьшено |
void (*GTypePluginCompleteTypeInfo) (GTypePlugin *plugin, GType g_type, GTypeInfo *info, GTypeValueTable *value_table);
Тип complete_type_info функции GTypePluginClass.
plugin : |
GTypePlugin |
g_type : |
GType чья информация заполнена |
info : |
GTypeInfo структура для заполнения |
value_table : |
GTypeValueTable для заполнения |
void (*GTypePluginCompleteInterfaceInfo) (GTypePlugin *plugin, GType instance_type, GType interface_type, GInterfaceInfo *info);
Тип complete_interface_info функции GTypePluginClass.
plugin : |
GTypePlugin |
instance_type : |
GType инстанциируемого типа к которому добавляется интерфейс |
interface_type : |
GType интерфейса чья информация заполнена |
info : |
GInterfaceInfo для заполнения |
void g_type_plugin_use (GTypePlugin *plugin);
Вызывает use_plugin функцию из
GTypePluginClass принадлежащей
plugin.
Нет необходимости использовать эту функцию вне системы типов GObject непосредственно.
plugin : |
GTypePlugin |
void g_type_plugin_unuse (GTypePlugin *plugin);
Вызывает unuse_plugin функцию из
GTypePluginClass принадлежащей
plugin.
Нет необходимости использовать эту функцию вне системы типов GObject непосредственно.
plugin : |
a GTypePlugin |
void g_type_plugin_complete_type_info (GTypePlugin *plugin, GType g_type, GTypeInfo *info, GTypeValueTable *value_table);
Вызывает complete_type_info функцию из
GTypePluginClass принадлежащей
plugin.
Нет необходимости использовать эту функцию вне системы типов GObject непосредственно.
plugin : |
GTypePlugin |
g_type : |
GType чья информация заполняется |
info : |
GTypeInfo структура для заполнения |
value_table : |
GTypeValueTable для заполнения |
void g_type_plugin_complete_interface_info
(GTypePlugin *plugin,
GType instance_type,
GType interface_type,
GInterfaceInfo *info);
Вызывает complete_interface_info функцию из
GTypePluginClass принадлежащей
plugin.
Нет необходимости использовать эту функцию вне системы типов GObject непосредственно.
plugin : |
GTypePlugin |
instance_type : |
GType инстанциируемого типа к которому добавляется интерфейс |
interface_type : |
GType интерфейса чья информация заполняется |
info : |
GInterfaceInfo для заполнения |
|
Закладки на сайте Проследить за страницей |
Created 1996-2025 by Maxim Chirkov Добавить, Поддержать, Вебмастеру |