Параллельное программирование на С++ в действии. Практика разработки многопоточных программ - [166]

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

>    state = &atm::wait_for_action;

>   }

>  ).handle(

>   [&](cancel_pressed const& msg) {

>    state = &atm::done_processing;

>   }

>  );

> }


> void wait_for_action() {

>  interface_hardware.send(display_withdrawal_options());

>  incoming.wait().handle(

>   [&](withdraw_pressed const& msg) {

>    withdrawal_amount = msg.amount;

>    bank.send(withdraw(account, msg.amount, incoming));

>    state = &atm::process_withdrawal;

>   }

>  ).handle(

>   [&](balance_pressed const& msg) {

>    bank.send(get_balance(account, incoming));

>    state = &atm::process_balance;

>   }

>  ).handle(

>   [&](cancel_pressed const& msg) {

>    state = &atm::done_processing;

>   }

>  );

> }


> void verifying_pin() {

>  incoming.wait().handle(

>   [&](pin_verified const& msg) {

>    state = &atm::wait_for_action;

>   }

>  ).handle(

>   [&](pin_incorrect const& msg) {

>    interface_hardware.send(

>     display_pin_incorrect_message());

>    state = &atm::done_processing;

>   }

>  ).handle(

>   [&](cancel_pressed const& msg) {

>    state = &atm::done_processing;

>   }

>  );

> }


> void getting_pin() {

>  incoming.wait().handle(

>   [&](digit_pressed const& msg) {

>    unsigned const pin_length = 4;

>    pin += msg.digit;

>    if (pin.length() == pin_length) {

>     bank.send(verify_pin(account, pin, incoming));

>     state = &atm::verifying_pin;

>    }

>   }

>  ).handle(

>   [&](clear_last_pressed const& msg) {

>    if (!pin.empty()) {

>     pin.pop_back();

>    }

>   }

>  ).handle(

>   [&](cancel_pressed const& msg) {

>    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);

>       std::cout << "Withdraw 50? (w)" << std::endl;

>       std::cout << "Display Balance? (b)"


Еще от автора Энтони Д Уильямс
Викиномика. Как массовое сотрудничество изменяет всё

Это знаменитый бестселлер, который научит вас использовать власть массового сотрудничества и покажет, как применять викиномику в вашем бизнесе. Переведенная более чем на двадцать языков и неоднократно номинированная на звание лучшей бизнес-книги, "Викиномика" стала обязательным чтением для деловых людей во всем мире. Она разъясняет, как массовое сотрудничество происходит не только на сайтах Wikipedia и YouTube, но и в традиционных компаниях, использующих технологии для того, чтобы вдохнуть новую жизнь в свои предприятия.Дон Тапскотт и Энтони Уильямс раскрывают принципы викиномики и рассказывают потрясающие истории о том, как массы людей (как за деньги, так и добровольно) создают новости, изучают геном человека, создают ремиксы любимой музыки, находят лекарства от болезней, редактируют школьные учебники, изобретают новую косметику, пишут программное обеспечение и даже строят мотоциклы.Знания, ресурсы и вычислительные способности миллиардов людей самоорганизуются и превращаются в новую значительную коллективную силу, действующую согласованно и управляемую с помощью блогов, вики, чатов, сетей равноправных партнеров и личные трансляции.


Рекомендуем почитать
Изучаем Java EE 7

Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java. Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода. Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP)


Программное обеспечение и его разработка

Автор книги — американский специалист по программированию, один из руководителей фирмы IBM, в своей книге делает попытку изложить общие проблемы создания программного обеспечения, его сопровождения и использования. Особенно подробно рассматриваются все фазы разработки программ разных типов. Изложение ясное, удачно иллюстрировано примерами.Для программистов разной квалификации и пользователей ЭВМ.fb2: ВНИМАНИЕ. В тексте присутствуют таблицы. Рекомендуется читать файл с помощью программы, поддерживающей их отображение.


Вариации на тему STL. Адаптер обобщенного указателя на функцию-член класса

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


Примеры использования Паттерн Singleton (Одиночка)

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


Создаем порт для FreeBSD своими руками. Часть II

Система сборки программ, используемая во FreeBSD, имеет значительно большие возможности, чем те, которые мы задействовали. Какие это возможности и как их использовать в своих портах?


FreeBSD - полезные советы

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