signal и метод класса
От: bkat  
Дата: 10.01.20 09:47
Оценка:
Сто лет уже не писал на с++ и вот потребовалось опять.
Можно ли как зарегистрировать нестатический метод класса как обработчик сигналов
#include <signal.h>

class MyClass {
public: 
    void myFunction () 
    {
        signal(SIGIO,myHandler); //< как?
    }

    void myHandler (int signum)
    {
    }
}


Что-то типа такого?
http://rsdn.org/forum/info/FAQ.cpp.threadandmember
Re: signal и метод класса
От: Pzz Россия https://github.com/alexpevzner
Дата: 10.01.20 09:54
Оценка:
Здравствуйте, bkat, Вы писали:

B>Сто лет уже не писал на с++ и вот потребовалось опять.

B>Можно ли как зарегистрировать нестатический метод класса как обработчик сигналов

Нет.

Функция signal() потребляет один параметр — указатель на функцию. Нестатический метод — это два параметра: указатель на функцию и указатель на экземпляр класса.
Re: signal и метод класса
От: reversecode google
Дата: 10.01.20 09:58
Оценка:
B>Что-то типа такого?
B>http://rsdn.org/forum/info/FAQ.cpp.threadandmember

там функция создания потока принимает аргументы
у вас только через статический инстанс и статическую функцию
Re[2]: signal и метод класса
От: bkat  
Дата: 10.01.20 10:04
Оценка:
Здравствуйте, Pzz, Вы писали:

Pzz>Здравствуйте, bkat, Вы писали:


B>>Сто лет уже не писал на с++ и вот потребовалось опять.

B>>Можно ли как зарегистрировать нестатический метод класса как обработчик сигналов

Pzz>Нет.


Pzz>Функция signal() потребляет один параметр — указатель на функцию. Нестатический метод — это два параметра: указатель на функцию и указатель на экземпляр класса.


это понятно.
А есть что-то другое для похожих целей?
Может какие новые стандартные обертки есть, кто с помощью std::bind можно сделать без статических конструкций?
Re[3]: signal и метод класса
От: reversecode google
Дата: 10.01.20 10:15
Оценка:
B>это понятно.
B>А есть что-то другое для похожих целей?
B>Может какие новые стандартные обертки есть, кто с помощью std::bind можно сделать без статических конструкций?

кто мешает вбить в гугл
С++ signal std::bind
и устроить себе суточное чтиво ?
первая ссылка с гугла
https://stackoverflow.com/questions/52013007/how-to-use-stdbind-function-as-a-signal-handler-in-c
Re[4]: signal и метод класса
От: bkat  
Дата: 10.01.20 10:30
Оценка:
Здравствуйте, reversecode, Вы писали:

B>>это понятно.

B>>А есть что-то другое для похожих целей?
B>>Может какие новые стандартные обертки есть, кто с помощью std::bind можно сделать без статических конструкций?

R>кто мешает вбить в гугл

R>С++ signal std::bind
R>и устроить себе суточное чтиво ?
R>первая ссылка с гугла
R>https://stackoverflow.com/questions/52013007/how-to-use-stdbind-function-as-a-signal-handler-in-c

Спасибо, посмотрю.
Хотя там все же обычные функции и все равно не вижу как сделать чтобы вызвался именно метод класса без явных статических струкрур.
Re[5]: signal и метод класса
От: reversecode google
Дата: 10.01.20 10:34
Оценка: 1 (1)
B>Спасибо, посмотрю.
B>Хотя там все же обычные функции и все равно не вижу как сделать чтобы вызвался именно метод класса без явных статических струкрур.

очевидно — никак
уже третим сообщения пытаюсь сказать
любая даже придуманная супер обертка будет корчить из себя статик функцию и инстанс
Re[3]: signal и метод класса
От: Pzz Россия https://github.com/alexpevzner
Дата: 10.01.20 10:49
Оценка: 4 (1) +1
Здравствуйте, bkat, Вы писали:

B>это понятно.

B>А есть что-то другое для похожих целей?
B>Может какие новые стандартные обертки есть, кто с помощью std::bind можно сделать без статических конструкций?

Никак. То, что тебе нужно, называется closure: это когда имея функцию #1 и некоторое количество аргументов к ней, динамически получают функцию #2, которая вызывает функцию #1, подставляя аргументы.

В C/C++ это невозможно сделать на уровне ABI (Application Binary Interface). Невозможно в процессе исполнения создать "настоящую" функцию, если ее не было в бинарном файле.

Максимум, что можно сделать, это создать объект с перегруженным оператором "скобки". Обращение к такому объекту из C++ будет выглядеть, как вызов функции, но только выглядеть — из него невозможно получить указатель на функцию, пригодный для C (без плюсов).

Поэтому указатель на объект придется где-то хранить отдельно. И тогда становится возможным использовать статические методы.
Re: signal и метод класса
От: Шахтер Интернет  
Дата: 10.01.20 17:01
Оценка:
Здравствуйте, bkat, Вы писали:

B>Сто лет уже не писал на с++ и вот потребовалось опять.

B>Можно ли как зарегистрировать нестатический метод класса как обработчик сигналов
B>
B>#include <signal.h>

B>class MyClass {
B>public: 
B>    void myFunction () 
B>    {
B>        signal(SIGIO,myHandler); //< как?
B>    }

B>    void myHandler (int signum)
B>    {
B>    }
B>}
B>


B>Что-то типа такого?

B>http://rsdn.org/forum/info/FAQ.cpp.threadandmember

Можно завести глобальную переменную, содержащую callback для вызова метода.
Любым удобным для тебя способом. И дергать его из глобальной функции.
В XXI век с CCore.
Копай Нео, копай -- летать научишься. © Matrix. Парадоксы
Re[5]: signal и метод класса
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 10.01.20 17:05
Оценка:
Здравствуйте, bkat, Вы писали:

B>Спасибо, посмотрю.

B>Хотя там все же обычные функции и все равно не вижу как сделать чтобы вызвался именно метод класса без явных статических струкрур.

В signal можно передать адрес обычной функции. Обычная функция кастит параметр к указателю на определенный класс, и вызывает какой-то его метод
Маньяк Робокряк колесит по городу
Re[6]: signal и метод класса
От: reversecode google
Дата: 10.01.20 17:20
Оценка:
Здравствуйте, Marty, Вы писали:

M>Здравствуйте, bkat, Вы писали:


B>>Спасибо, посмотрю.

B>>Хотя там все же обычные функции и все равно не вижу как сделать чтобы вызвался именно метод класса без явных статических струкрур.

M>В signal можно передать адрес обычной функции. Обычная функция кастит параметр к указателю на определенный класс, и вызывает какой-то его метод



this где взять для метода ?
Re[7]: signal и метод класса
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 10.01.20 18:23
Оценка:
Здравствуйте, reversecode, Вы писали:


M>>В signal можно передать адрес обычной функции. Обычная функция кастит параметр к указателю на определенный класс, и вызывает какой-то его метод


R>this где взять для метода ?


Ошибся. Думал, там есть void* параметр. Тогда — только в переменной хранить
Маньяк Робокряк колесит по городу
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.