Deleted Account
Deleted Account
я должен попробовать
🦥Alex Fails
Deleted Account
Deleted Account
джва аргумента в один
🦥Alex Fails
Думаю, да
babysitter
читал недавно блог-пост про это, поискать или сами закостылите?
Deleted Account
Deleted Account
Square
Вы тут не на функции-члены указатели шатаете?
Square
А. Догрузилась телега
Deleted Account
но он принимает на сигнал обработчик принимающий тока int
Square
Square
Square
Оно быстрее qt'шных сигналов
Square
Было по крайней мере до 5й версии
Square
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
Deleted Account
сделаю класс со статик методом который юзает статик мемберы-указатели на треад хендлеры
Matway
"The effects of signal() in a multithreaded process are unspecified"
Deleted Account
я же могу менят ьстатик мембер-указатели-натреад-хендлер
Sergey
ну норм. а зачем в принципе может понадобиться частичная подстановка
Sergey
юзкейс какой-нибудь
Anonymous
обертка над API например
Sergey
я понимаю, что функциональщина так и пишется. но на плюсах
Deleted Account
юзкейс какой-нибудь
ну как у меня, где требуют указатель на функцию с 1 аргументом а тебе хочется засунуть ту где 2
Surreal
Surreal
Мне в голову только синглтон с сеттером и геттером на пул объектов приходит. Некрасиво, правда.
Matway
Ты должен гарантировать, что registerHandler вызовется единожды. От статичности никуда не уйти.
Deleted Account
Matway
Разумеется, после такого инстанс Handler должен жить вечно.
Также рекомендую использовать sigaction, а не signal.
Deleted Account
Deleted Account
ну там сигинт сигкил сигтерм
Matway
Нет, совсем не обязательно.
Deleted Account
Matway
Можно сделать instance = this в конструкторе Handler::Handler().
Matway
После этого registerHandler можно вызывать многократно.
Denis
еще и ассерт поставить в кторе с проверкой что инстанс нулевой
Andrei
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* Handler::m_aniUpdater = aniUpdater.get();
handler->registerHandler(SIGINT);
handler->registerHandler(SIGTERM);
Matway
Параметр лучше передать через конструктор.
Deleted Account
Matway
Что такое "aniUpdater.get()"?
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
Deleted Account
про
sigaction
я не понял
Matway
sigaction лучше портируется и предоставляет больше контроля.
Matway
Но это уже оффтопик. Гуглить "signal man" и "sigaction man".