LINUX.ORG.RU

Если бы вы писали учебник по GLib, что бы вы рассказали про сигналы?

 ,


1

3

Читаю статью:
https://developer.gnome.org/gobject/stable/signal.html#signal-detail

И мне ну совершенно не ясны типовые сценарии.

Например сильно помог бы такой walkthrough:
1) создать свойство для некоторого класса
2) сделать событиеevent с именем «notify» для этого свойства
3) сделать фильтр для подписывания только на изменение этого события
4) сделать ещё одно свойство, продемострировать, что фильтр работает

Помог бы список типовых имён событий («change», «dispose», «destroy» - последние два я сам придумал). Чем, например «change» отличается от «notify»?

Помог бы пример с valist (где такое может понадобиться?). Ясно что это связано как-то с функциями типа printf, но дальше мысль не идёт.

Или, к примеру, GCallback. Когда я присоединяю сигнал, там ещё есть gpointer data. Зачем нужна data? Можно ли сказать, что это this объекта, функция которого становится коллбэком?

Что общего между событиями и вызовом функции g_object_run_dispose?
Если у меня есть рамы и мамы, подписанные на события друг друга, что надо писать, чтобы мама узнавала о разрушении рамы, а рама узнавала о смерти мамы?

★★☆

Последнее исправление: Einstok_Fair (всего исправлений: 3)

Если у меня есть рамы и мамы, подписанные на события друг друга, что надо писать, чтобы мама узнавала о разрушении рамы, а рама узнавала о смерти мамы?

На лоре прям какая-то преемственность шизофреников. Царь, анонимуз (не обычный анон, другой), den73, вот ты вот. Кто ещё заразится?

deadplace
()

Кстати, забыл спросить, а золотце сюда захаживал?

deadplace
()

Или, к примеру, GCallback. Когда я присоединяю сигнал, там ещё есть gpointer data. Зачем нужна data?

У каждого сигнала есть аргументы + data последним аргументом.

Вот, смотри простейший пример: https://developer.gnome.org/gtk3/stable/GtkButton.html#GtkButton-activate

Или вот с дополнительным аргументом: https://developer.gnome.org/gtk3/stable/GtkWidget.html#GtkWidget-drag-begin

Можно ли сказать, что это this объекта, функция которого становится коллбэком?

this обычно передаётся первым аргументом. Можно при желании передать data вместо this: https://developer.gnome.org/gobject/stable/gobject-Signals.html#g-signal-conn...

И мне ну совершенно не ясны типовые сценарии.

Проще всего почитать документацию и исходники GtkWidget. Там все типовые сценарии

monk ★★★★★
()

Самый правильный учебник про глиб — самый короткий. В нем просто написано: «не пользуйтесь этим дерьмом!».

ООПщина поверх С не нужна, без нее можно отлично обойтись.

anonymous
()
Ответ на: комментарий от monk

Зачем нужна data?

У каждого сигнала есть аргументы + data последним аргументом.

Ты ответил на вопрос «как она используется». Прочитал из учебника. Я тоже прочитал. Но это ответ не на мой вопрос. Уточню: зачем data вообще передаётся, пусть и последним аргументом?

Из примера про drag icon не ясно, используется ли data или иконка устанавливается без использования этого параметра.

Einstok_Fair ★★☆
() автор топика
Последнее исправление: Einstok_Fair (всего исправлений: 1)
Ответ на: комментарий от Einstok_Fair

Уточню: зачем data вообще передаётся, пусть и последним аргументом?

Например, хочу, чтобы при нажатии на кнопку А выводилось «Строка 1», а при нажатии на кнопку Б — «Строка 2». Если существует data, то я могу сделать один обработчик на обе кнопки, а текст строки передавать в аргументе data. Если бы его не было, то на каждую кнопку пришлось бы делать по отдельной функции.

monk ★★★★★
()
Ответ на: комментарий от Einstok_Fair

то, какая это была кнопка и так передаётся первым аргументом

И как эта информация позволит угадать действие по этой кнопке? Или ставить switch внутри обработчика? Так это неудобно.

monk ★★★★★
()
Ответ на: комментарий от monk

действие - это имя сигнала.

как раз если передавать data, то нужен switch, т.е. провоцируется плохая практика

Einstok_Fair ★★☆
() автор топика
Ответ на: комментарий от Einstok_Fair
void on_button_click(GtkButton* button, gpointer data)
{
    char *str = (char *)data;
    printf("%s\n", str);
}

GtkButton button1 = gtk_button_new_with_label("Button A");
GtkButton button2 = gtk_button_new_with_label("Button B");
g_signal_connect(button1, "clicked", &on_button_click, "Строка 1");
g_signal_connect(button2, "clicked", &on_button_click, "Строка 2");

Как будешь делать, если нет data?

monk ★★★★★
()
Последнее исправление: monk (всего исправлений: 1)
Ответ на: комментарий от monk

Как будешь делать, если нет data?

в том фреймворке, которым я пользовался раньше, у каждого контрола был тег для пользовательских данных.

т.е. я ожидаю чего-то такого:
(GString*)(button->Tag)

Einstok_Fair ★★☆
() автор топика
Ответ на: комментарий от Einstok_Fair

в том фреймворке, которым я пользовался раньше, у каждого контрола был тег для пользовательских данных.

Ну вот. А здесь есть пользовательские данные у обработчика сигнала. Ведь обработчиков может быть много и данные у каждого свои.

Впрочем у объекта тоже могут быть: https://developer.gnome.org/gobject/stable/gobject-The-Base-Object-Type.html#...

monk ★★★★★
()

А что именно не понятно?

При изменении какого-либо свойства эмитируется сигнал. К сигналу подключается обработчик сигнала. Например, изменение положения ползунка громкости, эмитирует сигнал value_changed и в качестве параметра передает указатель на текущее значение. Обработчик подключенный к сигналу получает указатель на это значение.

Если я правильно понял вопрос, то есть некий набор часто используемых предопределенных сигналов для конкретных объектов - «change», «dispose», «destroy». А notify используется когда ты хочешь обработать изменение произвольного свойства.

gpointer data — это как раз указатель на данные, который будет передан сигналом. Как в примере выше, указатель на double-значение ползунка. Можно передать и структуру, тогда можно получить и обработать несколько значений (s->a, s->b, s->c и т.д).

nvl ★★★
()

Ты как-то путано задаёшь вопросы.

К примеру, у тебя есть текстовое поле для ввода пароля. Ты соединяешь сигнал «activate» данного TextEntry, а в качестве data передаёшь указатель на введённый текст, который обрабатывается соответствующим хэндлером. Пользователь вводит некие символы в нужное поле, нажимает Enter -> издаётся (emit) сигнал, вызывается функция-хэндлер.

Или есть файл, для которого определён объект, регулярно опрашивающий файл на предмет изменения. Файл был изменён -> издаётся сигнал, оповещающий соответствующий хэндлер.

Объект, который «издаёт» сигнал, передаётся в обработчик автоматически, нет необходимости заботиться об этом.

В качестве data можно передать NULL, если в передаче произвольных данных в хэндлер нет необходимости.

meliafaro ★★★★★
()

Если бы вы писали учебник по GLib, что бы вы рассказали про сигналы?

Что есть Qt на нормальном языке с нормальными сигналами и вместо glib следует использовать её.

slovazap ★★★★★
()
Ответ на: комментарий от slovazap

Нормальные сигналы Qt принципиально ничем не отличаются от сигналов GLib, зато в GLib отсутствует совершенно не нужная абстракция в виде слотов. Нормальный язык, это какой?

nvl ★★★
()
Ответ на: комментарий от nvl

в GLib отсутствует совершенно не нужная абстракция в виде слотов.

давно qt использовал в последний раз ?

x905 ★★★★★
()
Ответ на: комментарий от Einstok_Fair

зачем data вообще передаётся, пусть и последним аргументом?

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

i-rinat ★★★★★
()
Ответ на: комментарий от slovazap

Что есть Qt на нормальном языке с нормальными сигналами и вместо glib следует использовать её.

Чем сигналы Qt более сигнальные, чем сигналы GLib?

meliafaro ★★★★★
()
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.