Параллельное программирование на С++ в действии. Практика разработки многопоточных программ - [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
> std::cout << "Issuing "
> << msg.amount << std::endl;
> }
> }
> ).handle
> [&](display_insufficient_funds const& msg) {
> {
> std::lock_guard
> std::cout << "Insufficient funds" << std::endl;
> }
> }
> ).handle
> [&](display_enter_pin const& msg) {
> {
> std::lock_guard
> std::cout
> << "Please enter your PIN (0-9)" << std::endl;
> }
> }
> ).handle
> [&](display_enter_card const& msg) {
> {
> std::lock_guard
> std::cout << "Please enter your card (I)"
> << std::endl;
> }
> }
> ).handle
> [&](display_balance const& msg) {
> {
> std::lock_guard
> std::cout
> << "The balance of your account is "
> << msg.amount << std::endl;
> }
> }
> ).handle
> [&](display_withdrawal_options const& msg) {
> {
> std::lock_guard
> std::cout << "Withdraw 50? (w)" << std::endl;
> std::cout << "Display Balance? (b)"
Это знаменитый бестселлер, который научит вас использовать власть массового сотрудничества и покажет, как применять викиномику в вашем бизнесе. Переведенная более чем на двадцать языков и неоднократно номинированная на звание лучшей бизнес-книги, "Викиномика" стала обязательным чтением для деловых людей во всем мире. Она разъясняет, как массовое сотрудничество происходит не только на сайтах Wikipedia и YouTube, но и в традиционных компаниях, использующих технологии для того, чтобы вдохнуть новую жизнь в свои предприятия.Дон Тапскотт и Энтони Уильямс раскрывают принципы викиномики и рассказывают потрясающие истории о том, как массы людей (как за деньги, так и добровольно) создают новости, изучают геном человека, создают ремиксы любимой музыки, находят лекарства от болезней, редактируют школьные учебники, изобретают новую косметику, пишут программное обеспечение и даже строят мотоциклы.Знания, ресурсы и вычислительные способности миллиардов людей самоорганизуются и превращаются в новую значительную коллективную силу, действующую согласованно и управляемую с помощью блогов, вики, чатов, сетей равноправных партнеров и личные трансляции.
Java Enterprise Edition (Java EE) остается одной из ведущих технологий и платформ на основе Java. Данная книга представляет собой логичное пошаговое руководство, в котором подробно описаны многие спецификации и эталонные реализации Java EE 7. Работа с ними продемонстрирована на практических примерах. В этом фундаментальном издании также используется новейшая версия инструмента GlassFish, предназначенного для развертывания и администрирования примеров кода. Книга написана ведущим специалистом по обработке запросов на спецификацию Java EE, членом наблюдательного совета организации Java Community Process (JCP)
Автор книги — американский специалист по программированию, один из руководителей фирмы IBM, в своей книге делает попытку изложить общие проблемы создания программного обеспечения, его сопровождения и использования. Особенно подробно рассматриваются все фазы разработки программ разных типов. Изложение ясное, удачно иллюстрировано примерами.Для программистов разной квалификации и пользователей ЭВМ.fb2: ВНИМАНИЕ. В тексте присутствуют таблицы. Рекомендуется читать файл с помощью программы, поддерживающей их отображение.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.
Система сборки программ, используемая во FreeBSD, имеет значительно большие возможности, чем те, которые мы задействовали. Какие это возможности и как их использовать в своих портах?
В книге рассказывается история главного героя, который сталкивается с различными проблемами и препятствиями на протяжении всего своего путешествия. По пути он встречает множество второстепенных персонажей, которые играют важные роли в истории. Благодаря опыту главного героя книга исследует такие темы, как любовь, потеря, надежда и стойкость. По мере того, как главный герой преодолевает свои трудности, он усваивает ценные уроки жизни и растет как личность.