Нижегородский файловый портал
RSS - каналы
Главное меню
Категории каталога
Мои статьи [5]
Школа покера [5]
Софт [40]
Радиолюбителям и электрикам [8]
Интернет [167]
Система [89]
Комплектующие ПК [47]
Безопасность [56]
Программирование [18]
Веб-дизайнеру [5]
Игры [6]
Полезные советы [24]
Кулинария [1]
Телефония [10]
Мобильник [17]
Планшеты [14]
Медицина [5]
Работа [4]
Домашнему мастеру [0]
Строительство и ремонт [19]
Для сада и огорода [2]
Юмор и приколы [12]
Интересное [114]
Пластики [3]
Разное [238]
Мини-чат
Правила мини-чата



Мини-чат в окне
Погода в Нижнем
Яндекс.Погода
Главная » Статьи » Программирование

Ликбез по Линуксу: о таймерах


Простой и удобный способ организации работы с таймерами для множества однотипных объектов одновременно.


Используемые системные вызовы: timer_create, timer_settime, timer_gettime.

1. Создадим базовый виртуальный класс, приблизительно такой:

class ITimer
{
 public:
  ITimer();
  ~ITimer();
  void CreateTimer();
  void DestroyTimer();
  void On(time_t vTime);
  void On(time_t vTime,long lNanoSec);
  time_t IsActive();
  time_t IsEndTime();
  void Off();
  void Waiting();
  virtual bool DoAction()=0;
 sigset_t psig_maskFirst;
 siginfo_t psig_infoFirst;
 struct sigevent sevFirst;
 struct sigaction saFirst;
};

Функция CreateTimer() может быть приблизительно такая:

void ITimer::CreateTimer()
{
 int ilErrno;
 saFirst.sa_flags = SA_SIGINFO;
 saFirst.sa_sigaction = handler_timer;
 if (sigaction(SIGRTMIN, &saFirst, NULL) == -1)
 {
  ilErrno = errno;
  fprintf(stderr," error. sigaction %s\n", getpid(),strerror(ilErrno));
 }
 sevFirst.sigev_notify = SIGEV_SIGNAL;
 sevFirst.sigev_signo = SIGRTMIN;
 sevFirst.sigev_value.sival_ptr = this;
 if (timer_create(CLOCK_REALTIME, &sevFirst, (void **)&timerFirstId) == -1)
 {
  ilErrno = errno;
  fprintf(stderr,"error timer_create. %s\n", strerror(ilErrno));
 }
}

Особое внимание здесь надо обратить на строку:

sevFirst.sigev_value.sival_ptr = this;

2. Подготовим обработчик сигнала SIGRTMIN:

static void handler_timer(int sig, siginfo_t *si, void *uc)
{
 ITimer* opITimer;
 opITimer = (ITimer*)si->si_int;
 opITimer->DoAction();
}

3. Подготовим классы, наследующие этот базовый класс ITimer.

class CUser:public ITimer
{
 public:
  CUser();
  ~CUser();
  virtual bool DoAction();
};
//---------------------------------
bool CUser::DoAction()
{
 fprintf(stdout," User:: Hello Word!!! \n");
}

class CAbonent:public ITimer
{
 public:
  CAbonent();
  ~CAbonent();
  virtual bool DoAction();
};
//---------------------------------
bool CAbonent::DoAction()
{
 fprintf(stdout," Abonent:: Hello Word!!! \n");
}

class CUnit:public ITimer
{
 public:
  CUnit();
  ~CUnit();
  virtual bool DoAction();
};
//---------------------------------
bool CUnit::DoAction()
{
 fprintf(stdout," CUnit:: Hello Word!!! \n");
}

И так далее...

В результате, после создания и включения таймера для объектов, например, типа CAbonent, обработчик сигнала сразу, без всякого анализа вызовет нужную функцию DoAction().
Добавил: Админ-21NN | Просмотров: 1455 | Рейтинг: 5.0/1


Обратите Ваше внимание на другие статьи:

Уважаемые пользователи, пожалуйста, оставляйте комментарии! Нам очень важно Ваше мнение!
Всего комментариев: 0
Добавлять комментарии могут только зарегистрированные пользователи.

    
Меню пользователя
Аватар гостя

Приветствуем Вас, Гость

Логин:
Пароль:
Поиск по сайту
Поиск по названию
Поиск по тегам
Горячие темы форума
Стол заказов
поговорим о софте
Зарабатываем деньги
Детская игра Подарки...
Тест скорости подклю...
кое что о Windows
Кто ты, человек?
Новая валюта портала
Все о сексе
"Что мешает нам...
Культура
Афоризмы
Лучшие 13 анекдотов ...
как защитить свой ко...
восстановление данны...
Я ненавижу Дом-2
Волга-Телеком
Кулинария "Кокт...
Жалобы
С Днем Победы!!!
Прикольные картинки
С праздником Пасхи !...
Статистика
Новых за месяц: 130
Новых за неделю: 41
Новых вчера: 6
Новых сегодня: 3
Всего: 5499
Из них:
Администраторов: 6
$$$-Модераторов: 2
Модераторов: 5
Прокураторов: 5
-----------------
далее:
Проверенных: 260
Пользователей: 3034
Новичков: 1884
Заблокированных: 110
-----------------
Из всех пользователей:
Мужчин и парней: 4322
Женщин и девушек: 1176
Именинники
Поздравляем с Днем рожденья:

147иг(31), IvaTUR(45), REFFY(24), neo24554(25), Кандиман(47), rzaev(56), Amour88(23), errangel(35)
Режим ON-LINE
Онлайн всего: 1
Гостей: 1
Пользователей: 0

Сейчас на портале:
Наша кнопочка
Нижегородский файловый портал

HTML-код кнопки:
Реклама
Размещение рекламы

Яндекс.Метрика
Регистрация сайта в каталогах, раскрутка и оптимизация сайта, контекстная реклама Ремонт холодильников в Нижнем Новгороде

Copyright © BankRemStroy © 2009-2019
x