Обратные вызовы в C++ - [46]

Шрифт
Интервал

Листинг 96. Отслеживание пороговых значений

>void Observer::poll()

>{

>  using namespace std::chrono_literals;


>  while (!exit_)  // (1)

>  {

>    std::this_thread::sleep_for(1s);           // (2)

>    std::lock_guard lock(mutex_);  // (3)


>    for (auto& item : containerAlert)  // (4)

>    {

>      Alert& alert = item.second;

>      alert.currentTimeout++;          // (5)

>      if (alert.checkTimeout != 0 && alert.currentTimeout >= alert.checkTimeout)  // (6)

>      {

>          bool triggerAlert = false;


>          if (alert.alertRule == AlertRule::More)  // (7)

>          {

>            triggerAlert = alert.sensor->getValue() > alert.alertValue;

>          }

>          else               // (8)

>          {

>            triggerAlert = alert.sensor->getValue() < alert.alertValue;

>          }


>          if (triggerAlert)  // (9)

>          {

>              alert.checkTimeout = alert.callback(item.first, alert.alertValue);  // (10)

>          }


>          alert.currentTimeout = 0;  // (11)

>        }

>    }

>  }

>}

В строке 1 объявлен цикл опроса, который выполняется, пока не выставлен индикатор завершения (выставляется в методе stop). В строке 2 поток засыпает на 1 секунду, т. е. интервал опроса равен 1 секунде. В строке 3 блокируется мьютекс, чтобы избежать коллизий добавления/удаления элементов в контейнере.

В строке 4 осуществляется опрос элементов, хранящихся в контейнере. Текущее время опроса в строке 5 увеличивается на единицу. Если уведомление разрешено, о чем говорит ненулевое значение timeout, и время последнего опроса превысило назначенное время (строка 6), то тогда проверяется, имелось ли превышение пороговых значений в соответствии с назначенными правилами (строки 6, 7). Если превышение зафиксировано (строка 9), то осуществляется обратный вызов (строка 10). Этот вызов возвращает следующий интервал опроса, после чего текущее время сбрасывается (строка 11).

6.2.8. Интерфейсный класс

Класс, объявляющий интерфейс для взаимодействия с приложением, представлен в Листинг 97.

Листинг 97. Интерфейсный класс (ControlInterface.h)

>namespace sensor

>{


>  class ISensorControl

>  {

>  public:

>    virtual ~ ISensorControl () = default;


>    virtual void initialize() = 0;  // (1)

>    virtual void shutDown() = 0;    // (2)

>    virtual void assignDriver(DriverPointer driver) = 0;  // (3)

>    virtual DriverPointer getAssignedDriver() = 0;        // (4)

>    virtual DriverPointer getSensorDriver(SensorNumber number) = 0;    // (5)

>    virtual void addSensor(SensorType type, SensorNumber number) = 0;  // (6)

>    virtual void deleteSensor(SensorNumber number) = 0;           // (7)

>    virtual bool isSensorExist(SensorNumber number) = 0;          // (8)

>    virtual bool isSensorOperable(SensorNumber number) = 0;       // (9)

>    virtual SensorValue getSensorValue(SensorNumber number) = 0;  // (10)

>    virtual void querySensorValue(SensorNumber number, SensorValueCallback callback) = 0;  // (11)

>    virtual void readSensorValues(SensorValueCallback callback) = 0;                       // (12)

>    virtual SensorValue getMinValue(SensorNumber first, SensorNumber last) = 0;  // (13)

>    virtual SensorValue getMaxValue(SensorNumber first, SensorNumber last) = 0;  // (14)

>    virtual void setAlert(SensorNumber number, SensorAlertCallback callback, SensorValue alertValue, AlertRule alertRule, CheckAlertTimeout checkTimeoutSeс = 1) = 0;  // (15)

>      virtual void resetAlert(SensorNumber number) = 0;  // (16)


>      static ISensorControl* createControl();            // (17)

>  };

>};


В строке 1 и 2 объявлены методы для запуска и останова. В строках 3 и 4 объявлены методы для назначения и получения драйвера. Этот драйвер должен быть создан и назначен в самом начале работы, поскольку он будет передаваться новым создаваемым датчикам. Узнать назначенный драйвер для соответствующего датчика можно в методе 5.

В строках 6 и 7 объявлены методы для добавления и удаления датчика. В методе 8 можно проверить, существует ли датчик с переданным номером, в методе 9 можно проверить, является ли датчик работоспособным.

В строке 10 объявлен метод для чтения текущего показания датчика. В методе 11 осуществляется асинхронный запрос показания датчика, значение будет возвращаться через передаваемый обратный вызов. В строке 12 осуществляется опрос показаний всех работоспособных датчиков, значения также возвращаются через обратный вызов. С помощью методов, объявленных в строках 13 и 14, можно получить минимальное и максимальное значение для набора датчиков с номерами из указанного диапазона.

В строке 15 назначается отслеживание пороговых значений, в строке 16 отслеживание выключается. С помощью метода, объявленного в строке 17, можно создать экземпляр соответствующего интерфейсного класса.


Класс, реализующий интерфейс, приведен в Листинг 98.

Листинг 98 Класс, реализующий интерфейс (SensorControl.h)

>namespace sensor

>{


>class ISensor;

>class IDriver;

>class CommandQueue;

>class AlertControl;

>class SensorContainer;


>class SensorControl: public ISensorControl

>{

>  public:

>    SensorControl();

>    ~SensorControl();

>    void initialize() override;

>    /* Other Interface methods – they are not displayed here*/


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


Java 7

Рассмотрено все необходимое для разработки, компиляции, отладки и запуска приложений Java. Изложены практические приемы использования как традиционных, так и новейших конструкций объектно-ориентированного языка Java, графической библиотеки классов Swing, расширенной библиотеки Java 2D, работа со звуком, печать, способы русификации программ. Приведено полное описание нововведений Java SE 7: двоичная запись чисел, строковые варианты разветвлений, "ромбовидный оператор", NIO2, новые средства многопоточности и др.


MFC и OpenGL

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Симуляция частичной специализации

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Обработка событий в С++

В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.