Surreal
а мож хер с ним, сделаю класс , у него будут мемберы с этим указателем и метод дёргающий мембера, и прсото в сигнал скормлю указатель на этот метод
Только статические функции-члены можно приводить к обычным указателям на функции, нет? У не статической функции-члена "void fn(int)" будет тип "void (class*)(int)". Или я путаю чего?
Deleted Account
я должен попробовать
Deleted Account
джва аргумента в один
🦥Alex Fails
Думаю, да
babysitter
читал недавно блог-пост про это, поискать или сами закостылите?
babysitter
про бинд или про лямбы ?
http://www.cyberforum.ru/blogs/212894/blog4325.html
Square
Вы тут не на функции-члены указатели шатаете?
Deleted Account
Вы тут не на функции-члены указатели шатаете?
вообще хотелось бы по сигинту постопать треды, был заюзан signal.h
Square
А. Догрузилась телега
Deleted Account
но он принимает на сигнал обработчик принимающий тока int
Square
вообще хотелось бы по сигинту постопать треды, был заюзан signal.h
Да у меня часть переписки пропала - не понял чо за ботва сходу
Deleted Account
Да у меня часть переписки пропала - не понял чо за ботва сходу
=) , и хочется натолкать указателей на треад хендлеры в этот обработчик сигнала
Square
Оно быстрее qt'шных сигналов
Square
Было по крайней мере до 5й версии
Deleted Account
но я то пр осигналы от ОС
Deleted Account
А массив отдать?
некуда отдавать
Matway
Указатель на не-статический мембер класса имеет тип result (/*calling convention specifier*/ ClassName::* )(parameters...) Это нельзя привести к обычному указателю на функцию.
Deleted Account
void (*signal(int sig, void (*func)(int)))(int);
Deleted Account
void (*func)(int) вот так нужно отдать хендлер сигнала
Sergey
почитал тут про std::bind а для чего обычно такую штуку юзают?
Deleted Account
при том что в int будет код сигнала вроде
Matway
В твоём случае нужно где-то получить функцию, которая будет получать только один параметр - int. Это либо статический мембер какого-то класса (что исключает bind и lambda), либо свободная функция.
Sergey
частичную подстановку аргументов. где это может быть полезно
Surreal
Можно сложить объекты в класс, сделать friend функцию, которая принимает int. Так должно работать, наверное.
Matway
Эта функция должна как-то увидеть инстанс класса. Он может быть только записан в какую-то статическую переменную. Вне или внутри функции.
babysitter
почитал тут про std::bind а для чего обычно такую штуку юзают?
в с++14 лямбды полностью сделали бинд ненужным
Deleted Account
сделаю класс со статик методом который юзает статик мемберы-указатели на треад хендлеры
Matway
"The effects of signal() in a multithreaded process are unspecified"
Deleted Account
я же могу менят ьстатик мембер-указатели-натреад-хендлер
Sergey
в с++14 лямбды полностью сделали бинд ненужным
грубо говоря - он выведет новую лямбду, где часть аргументов связана?
Sergey
ну норм. а зачем в принципе может понадобиться частичная подстановка
Sergey
юзкейс какой-нибудь
Anonymous
обертка над API например
Sergey
я понимаю, что функциональщина так и пишется. но на плюсах
Deleted Account
юзкейс какой-нибудь
ну как у меня, где требуют указатель на функцию с 1 аргументом а тебе хочется засунуть ту где 2
babysitter
грубо говоря - он выведет новую лямбду, где часть аргументов связана?
если тебе нужно забросить куда-нибудь предикат, или кто-то ждет колабл объект с зафиксированным интерфейсом, а у тебя есть функция, которая делает тоже самое, но интерфейсы не матчатся.
Surreal
Мне в голову только синглтон с сеттером и геттером на пул объектов приходит. Некрасиво, правда.
Matway
ну как у меня, где требуют указатель на функцию с 1 аргументом а тебе хочется засунуть ту где 2
Если тебе позарез нужно инкапсулировать обработчик, можешь сделать это вот так: class Handler { public: void registerHandler(int signum) { instance = this; signal(signum, staticHandle); } private: static Handler* instance; static void staticHandle(int signum) { instance->handle(signum); } void handle(int signum) { // Handle it! } };
Matway
Ты должен гарантировать, что registerHandler вызовется единожды. От статичности никуда не уйти.
Matway
Разумеется, после такого инстанс Handler должен жить вечно. Также рекомендую использовать sigaction, а не signal.
Deleted Account
ну там сигинт сигкил сигтерм
Matway
Нет, совсем не обязательно.
Matway
Можно сделать instance = this в конструкторе Handler::Handler().
Matway
После этого registerHandler можно вызывать многократно.
Deleted Account
После этого registerHandler можно вызывать многократно.
undefined reference to `(anonymous namespace)::Handler::instance' build/obj/main.o: In function `staticHandle':
Denis
еще и ассерт поставить в кторе с проверкой что инстанс нулевой
Andrei
За определением класса.
Andrei
Handler* Handler::instance = nullptr; напиши после определния класса.
Andrei
В cpp-шнике
Matway
Ага. Насчёт assert правильная мысль.
Matway
Недавно, кстати, обсуждали использование new/delete в коде. Так вот - это редкий случай, когда можно использовать голый new. Мало того, намеренно никогда не вызывать delete!
Matway
auto handler = new Handler; handler->registerHandler(...); handler->registerHandler(...);
Deleted Account
auto handler = new Handler; handler->registerHandler(...); handler->registerHandler(...);
main.cpp:199:36: error: qualified-id in declaration before ‘=’ token Handler* Handler::m_aniUpdater = aniUpdater.get();
Deleted Account
auto handler = new Handler(); Handler* Handler::m_aniUpdater = aniUpdater.get(); handler->registerHandler(SIGINT); handler->registerHandler(SIGTERM);
Matway
Параметр лучше передать через конструктор.
Matway
Что такое "aniUpdater.get()"?
Deleted Account
Что такое "aniUpdater.get()"?
std::unique_ptr<AniUpdater> aniUpdater;
Deleted Account
Что такое "aniUpdater.get()"?
... private: static Handler* instance; static AniUpdater* m_aniUpdater; ...
Deleted Account
починил
Matway
Как-то http://ideone.com/QngGQl так должно получиться.
Deleted Account
работает
Deleted Account
void handle(int signum) { PINFO("infoLog") << "[exit] "; PINFO("infoLog") << m_aniUpdater; if(nullptr != m_aniUpdater) { m_aniUpdater->terminate(); m_aniUpdater->join(); } qApp->quit(); // Handle it! }
Deleted Account
про sigaction я не понял
Matway
sigaction лучше портируется и предоставляет больше контроля.
Matway
Но это уже оффтопик. Гуглить "signal man" и "sigaction man".
Deleted Account
Но это уже оффтопик. Гуглить "signal man" и "sigaction man".
а как сделать переменное число указателей на объекты разного типа вместо m_aniUpdater