std::cout << "Withdraw 50? (w)" << std::endl;
std::cout << "Display Balance? (b)"
<< std::endl;
std::cout << "Cancel? (c) " << std::endl;
}
}
).handle
[&](display_withdrawal_cancelled const& msg) {
{
std::lock_guard
std::cout << "Withdrawal cancelled"
<< std::endl;
}
}
).handle
[&](display_pin_incorrect_message const& msg) {
{
std::lock_guard
std::cout << "PIN incorrect" << std::endl;
}
}
).handle
[&](eject_card const& msg) {
{
std::lock_guard
std::cout << "Ejecting card" << std::endl;
}
}
);
}
} catch (messaging::close_queue&) {
}
}
messaging::sender get_sender() {
return incoming;
}
};
Листинг С.10. Управляющая программа
int main() {
bank_machine bank;
interface_machine interface_hardware;
atm machine(bank.get_sender(), interface_hardware.get_sender());
std::thread bank_thread(&bank_machine::run, &bank);
std::thread if_thread(&interface_machine::run,
&interface_hardware);
std::thread atm_thread(&atm::run, &machine);
messaging::sender atmqueue(machine.get_sender());
bool quit_pressed = false;
while (!quit_pressed) {
char c = getchar();
switch(с) {
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
atmqueue.send(digit_pressed(с));
break;
case 'b':
atmqueue.send(balance_pressed());
break;
case 'w':
atmqueue.send(withdraw_pressed(50));
break;
case 'с':
atmqueue.send(cancel_pressed());
break;
case 'q':
quit_pressed = true;
break;
case 'i':
atmqueue.send(card_inserted("acc1234"));
break;
}
}
bank.done();
machine.done();
interface_hardware.done();
atm_thread.join();
bank_thread.join();
if_thread.join();
}
В заголовке
объявлены классы для представления моментов времени, интервалов и часов, которые служат источником объектов time_point
. В каждом классе часов имеется статическая переменная-член is_steady
, показывающая, являются ли данные часы std::chrono::steady_clock
.
namespace std {
namespace chrono {
template
class duration;
template<
typename Clock,
typename Duration = typename Clock::duration>
class time_point;
class system_clock;
class steady_clock;
typedef unspecified-clock-type high_resolution_clock;
}
}
Шаблон класса std::chrono::duration
предназначен для представления интервалов. Параметры шаблона Rep
и Period
— это соответственно тип данных для хранения значения интервала и конкретизация шаблона класса std::ratio
, которая задает промежуток времени (в виде долей секунды) между последовательными «тиками». Например, std::chrono::duration
определяет количество миллисекунд, представимое значением типа int
, std::chrono::duration
— количество пятидесятых долей секунды, представимое значением типа short
, а std::chrono::duration
— количество минут, представимое значением типа long long
.
template