LINUX.ORG.RU

Обработчик сигнала в классе C++


0

0

Как сделать в C++ примерно такое:

void myclass::handler(int signum)
{
      // some actions
}

void myclass::register()
{
    signal(SIGUSR1, handler);
}

? gcc на такую конструкцию (на содержимое метода register()) ругается, равно как и на
     signal(..., this->handler); и
     signal(..., myclass::handler);


Может есть варианты с помощью различных reinterpret_cast<> (я в них не разбираюсь)? Спасибо.
★★★
Ответ на: комментарий от bbk123

> Сделайте метод myclass::handler() статическим.

Но статический метод не позволяет использовать нестатические члены класса, а мне это необходимо. Может есть еще какой-либо вариант? Спасибо.

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

не получится как минимум по одной простой причине: сигнатура метода объекта отличается от сигнатуры подобного метода класса: метод объекта имеет один дополнительный аргумент - указатель на экземпляр класса.

Pi ★★★★★
()

Задача из разряда тех, в которых кривость C++ выперает во всей красе.

Придется делать обверточную функцию, которая будет получать сигнал и вызывать ожидающих их списка. Список либо в ручную (list<myclass*>), либо boost::signal + процедуры вставки/удаления (незабыть отключить сигналы)

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

>Задача из разряда тех, в которых кривость C++ выперает во всей красе.

а в чем проявляется кривость?

В том что объекты нельзя подсунуть необъектно ориентированному интерфейсу?
Вот если было бы можно, тогда C++ действительно стал бы еще кривее.

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

>а в чем проявляется кривость?

class A {int f; int method(){ return f;};}

Можно ли по стандарту использовать A::method как int (*)(A&)?

Можно ли использовать A::A как A& (*)() или как void(*)(A&)?

Можно ли по A a, соорудить нечто, что можно передать вместо int(*)()?

Да и зачем вообще эти самые A&, чем это хуже A*

В boost::signal черт ногу сломит (чесно говоря не представляю как оно работает). Просто сделать вменяемый callback превращается в нетривиальную проблему. А проблему(и не только эту) можно было решить просто добавлением пары примитивов в стандарт.

ival ★★
()

>.. которая будет получать сигнал и вызывать ожидающих 
> их списка. 

Может не совсем понял и скажу то-же самое, может нет.
Обработчик сигнала лучше делать минимальный.

Если производительность позволяет, можно сделать
 модель сообщений.
Получен сигнал - посылается сообщение в очередь.
Тот, кому нужно - слушает очередь. Правда очередь
придется делать как разделяемый объект.

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

> А вот если б в C++ были замыкания... :)

boost::bind спасет отца русской демократии

anonymous
()

Ответ ясен. Всем спасибо за помощь.

kondor ★★★
() автор топика

а libsigc++ не поможет?

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

блядь какие долбоёбы на свет рождаются.

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