Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Объекты и прерывания  (Прочитано 8035 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Faust
Гость
« : 18-03-2004 13:13 » 

Здравствуйте.
Сегодня столкнулся с проблемой - необходимо назначить в качестве обработчика прерывания метод объекта. Казалось-бы пустяковая операция, но не тут-то было - выбивает ошибку:

Error 117: Member function must be called or its address taken

Переназначение обработчика я произвожу в конструкторе, возврат - в деструкторе.
Т.е. пишу следующий код:

setvect(0x09,NewHandler);

где NewHandler - метод объекта.
Записан
Serega
Гость
« Ответ #1 : 19-03-2004 09:45 » 

Можно использовать статический метод
Записан
Diletant
Помогающий

de
Offline Offline

« Ответ #2 : 19-03-2004 09:57 » 

Цитата: Serega
Можно использовать статический метод


Скорее, нужно. Хотя сама идея назначения функции обработки прерывания таким образом не корректна. А создашь ты второй объект того же класса и...? Если уж так хочется, то лучше указать в качестве обработчика функцию с указателем на переменную класса в качестве  параметра.
Записан
ysv_
Помогающий

ua
Offline Offline

« Ответ #3 : 19-03-2004 12:22 » 

Цитата

Скорее, нужно. Хотя сама идея назначения функции обработки прерывания таким образом не корректна. А создашь ты второй объект того же класса и...? Если уж так хочется, то лучше указать в качестве обработчика функцию с указателем на переменную класса в качестве параметра.

В функцию обработчик прерывания нельзя передать параметр. Наиболее подходит статический метод, как сказал Serega. Если нужно использовать несколько обработчиков - все равно статический метод. Просто он должен будеть обработать стек созданных объектов. Конструктор должен занести адрес объект в стек обработки, а деструктор исключить из стека. Стек будет статическим членом класса.
Записан
Diletant
Помогающий

de
Offline Offline

« Ответ #4 : 19-03-2004 12:44 » 

Цитата: ysv_

В функцию обработчик прерывания нельзя передать параметр.


Нельзя так нельзя. Тогда лучше определить переменную класса внутри функции обработки прерывания и затем использовать его методы и члены. Я отнюдь не утверждал, что использование статического метода класса в качестве функции обработки прерывания с точки зрения синтаксиса неправильно. Просто ИМХО оно чревато всевозможными последствиями.  К примеру, никто не может гарантировать, что сам разработчик или его коллега по проекту не декларирует переменную того же типа (класса) только для того, чтобы использовать какой-либо его метод в своих целях. Последствия этого могут быть самыми интересными Ага
Записан
ysv_
Помогающий

ua
Offline Offline

« Ответ #5 : 19-03-2004 13:04 » 

Цитата

Последствия этого могут быть самыми интересными

Согласен! Я упустил из виду, что Faust хочет инсталировать обработчик в конструкторе, а удалять в деструкторе. В этом случае решение зависит от задачи. Если нужен только один объект - использовать синглтон, а иначе стек, как я писал выше. Только добавить проверку на пустоту стека и установку и удаление обработчика проводить при пустом стеке.
Записан
Anonymous
Гость
« Ответ #6 : 20-03-2004 09:58 » 

Всем спасибо. Насчет статических методов - это хорошая идея. Но я, наверное, сделаю все по-другому. Дело в том, что я создаю класс - стек событий и сообщений. Когда-то давно я делал нечто подобное на Паскале, но сейчас переношу все это в С++.
Я попробую сделать все следующим образом: создам экземпляр класса и функцию-обработчик, не являющуюся членом класса. Эта функция будет вызивать метод обьекта, отвечающий за добавление событий в очередь.

А все-таки интересно, если-бы я все сделал по-старому и создал два экзампляра класса - чей метод вызвало-бы прерывание?
Записан
ysv_
Помогающий

ua
Offline Offline

« Ответ #7 : 21-03-2004 18:29 » 

Цитата

А все-таки интересно, если-бы я все сделал по-старому и создал два экзампляра класса - чей метод вызвало-бы прерывание?

Все зависит от реализации. Но без дополнительных усилий - ничей. Посколько сама по себе статическая функция не знает о существовании экземпляров класса. Ей нужно откуда то получать ссылки или указатели на них. Пример:

// декларация (.H файл)
class InterruptHandler
{
  public:
    static interrupt Handler();
    InterruptHandler();
    ~InterruptHandler();

   void SomeMethod();

  private:
    static list<InterruptHandler*> list_;
    static void (*oldHandler_)();
};


// реализация (.CPP файл)
list<InterruptHandler*> InterruptHandler::list_;
void (*InterruptHandler::oldHandler_)();

InterruptHandler::InterruptHandler()
{
  if (list_.empty())
  {
    oldHandler_=getvect(9);
    setvect(9, &Handler);
  }
  stack_.push_front(this);
}

InterruptHandler::~InterruptHandler()
{
  list_.remove(this);
  if (stack_.empty())
  {
    setvect(9, oldHandler_);
  }
}

InterruptHandler::Handler()
{
   // Запрет прерываний
   list<InterruptHandler*>::iterator i;
   for (i=list_.begin(); i!=list_.end(); ++i)
   {
      i->SomeMethod();
   }
   // разрешение прерываний
}

InterruptHandler::SomeMethod()
{
   // Что-то нужное
}

Цитата

Я попробую сделать все следующим образом: создам экземпляр класса и функцию-обработчик, не являющуюся членом класса. Эта функция будет вызивать метод обьекта, отвечающий за добавление событий в очередь.

А очередь где будеш хранить?
Записан
Faust
Гость
« Ответ #8 : 24-03-2004 17:21 » 

В том-то и дело, что мне уже не нужна очередь. Работает единственный экземпляр класса. Инициализация проходит один раз. При каждом возникновении прерывания происходит вызов процедуры, которая обращается к обьекту. Точнее к одному из его методов.
Обьект - очередь событий.
Записан
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines