Читаем Параллельное программирование на С++ в действии полностью

    state = &atm::done_processing;

   }

  );

 }

 void waiting_for_card() {

  interface_hardware.send(display_enter_card());

  incoming.wait().handle(

   [&](card_inserted const& msg) {

    account = msg.account;

    pin = "";

    interface_hardware.send(display_enter_pin());

    state = &atm::getting_pin;

   }

  );

 }

 void done_processing() {

  interface_hardware.send(eject_card());

  state = &atm::waiting_for_card;

 }

 atm(atm const&) = delete;

 atm& operator=(atm const&) = delete;

public:

 atm(messaging::sender bank_,

  messaging::sender interface_hardware_):

   bank(bank_), interface_hardware(interface_hardware_) {}

 void done() {

  get_sender().send(messaging::close_queue());

 }

 void run() {

  state = &atm::waiting_for_card;

  try {

   for (;;) {

    (this->*state)();

   }

  } catch(messaging::close_queue const&) {

  }

 }

 messaging::sender get_sender() {

  return incoming;

 }

};

Листинг С.8. Конечный автомат банка

class bank_machine {

 messaging::receiver incoming;

 unsigned balance;

public:

 bank_machine():

  balance(199) {}

 void done() {

  get_sender().send(messaging::close_queue());

 }

 void run() {

  try {

   for (;;) {

    incoming.wait().handle(

     [&](verify_pin const& msg) {

      if (msg.pin == "1937") {

       msg.atm_queue.send(pin_verified());

      } else {

       msg.atm_queue.send(pin_incorrect());

      }

     }

    ).handle(

     [&](withdraw const& msg) {

      if (balance >= msg.amount) {

       msg.atm_queue.send(withdraw_ok());

       balance -= msg.amount;

      } else {

       msg.atm_queue.send(withdraw_denied());

      }

     }

    ).handle(

     [&](get_balance const& msg) {

      msg.atm_queue.send(::balance(balance));

     }

    ).handle(

     [&](withdrawal_processed const& msg) {

     }

    ).handle(

     [&](cancel_withdrawal const& msg) {

     }

    );

   }

  } catch(messaging::close_queue const&) {

  }

 }

 messaging::sender get_sender() {

  return incoming;

 }

};

Листинг С.9. Конечный автомат пользовательского интерфейса

class interface_machine {

 messaging::receiver incoming;

public:

 void done() {

  get_sender().send(messaging::close_queue());

 }

 void run() {

  try {

   for (;;) {

    incoming.wait().handle (

     [&](issue_money const& msg) {

      {

       std::lock_guard lk(iom);

       std::cout << "Issuing "

                 << msg.amount << std::endl;

      }

     }

    ).handle(

     [&](display_insufficient_funds const& msg) {

      {

       std::lock_guard lk(iom);

       std::cout << "Insufficient funds" << std::endl;

      }

     }

    ).handle(

     [&](display_enter_pin const& msg) {

      {

       std::lock_guard lk(iom);

       std::cout

        << "Please enter your PIN (0-9)" << std::endl;

      }

     }

    ).handle(

     [&](display_enter_card const& msg) {

      {

       std::lock_guard lk(iom);

       std::cout << "Please enter your card (I)"

                 << std::endl;

      }

     }

    ).handle(

     [&](display_balance const& msg) {

      {

       std::lock_guard lk(iom);

       std::cout

        << "The balance of your account is "

        << msg.amount << std::endl;

      }

     }

    ).handle(

     [&](display_withdrawal_options const& msg) {

      {

       std::lock_guard lk(iom);

Перейти на страницу:

Похожие книги

1С: Бухгалтерия 8 с нуля
1С: Бухгалтерия 8 с нуля

Книга содержит полное описание приемов и методов работы с программой 1С:Бухгалтерия 8. Рассматривается автоматизация всех основных участков бухгалтерии: учет наличных и безналичных денежных средств, основных средств и НМА, прихода и расхода товарно-материальных ценностей, зарплаты, производства. Описано, как вводить исходные данные, заполнять справочники и каталоги, работать с первичными документами, проводить их по учету, формировать разнообразные отчеты, выводить данные на печать, настраивать программу и использовать ее сервисные функции. Каждый урок содержит подробное описание рассматриваемой темы с детальным разбором и иллюстрированием всех этапов.Для широкого круга пользователей.

Алексей Анатольевич Гладкий

Программирование, программы, базы данных / Программное обеспечение / Бухучет и аудит / Финансы и бизнес / Книги по IT / Словари и Энциклопедии
1С: Управление торговлей 8.2
1С: Управление торговлей 8.2

Современные торговые предприятия предлагают своим клиентам широчайший ассортимент товаров, который исчисляется тысячами и десятками тысяч наименований. Причем многие позиции могут реализовываться на разных условиях: предоплата, отсрочка платежи, скидка, наценка, объем партии, и т.д. Клиенты зачастую делятся на категории – VIP-клиент, обычный клиент, постоянный клиент, мелкооптовый клиент, и т.д. Товарные позиции могут комплектоваться и разукомплектовываться, многие товары подлежат обязательной сертификации и гигиеническим исследованиям, некондиционные позиции необходимо списывать, на складах периодически должна проводиться инвентаризация, каждая компания должна иметь свою маркетинговую политику и т.д., вообщем – современное торговое предприятие представляет живой организм, находящийся в постоянном движении.Очевидно, что вся эта кипучая деятельность требует автоматизации. Для решения этой задачи существуют специальные программные средства, и в этой книге мы познакомим вам с самым популярным продуктом, предназначенным для автоматизации деятельности торгового предприятия – «1С Управление торговлей», которое реализовано на новейшей технологической платформе версии 1С 8.2.

Алексей Анатольевич Гладкий

Финансы / Программирование, программы, базы данных