開発環境
- Microsoft Windows 8 Pro 64bit 日本語 (OS)
- Microsoft Visual Studio Express 2012 for Windows Desktop (IDE)
- プログラミング言語: C#
『初めてのC# 第2版』(Jesse Liberty+Brian MacDonald著、日向俊二訳、オライリー・ジャパン、2006年、ISBN978-487311-294-7)の 第16章(デリゲートとイベント)17.6(練習問題)問題17-1を解いてみる。
その他参考書籍
問題17-1.
コード
using System; using System.Threading; class TimeInfoEventArgs : EventArgs { public TimeInfoEventArgs(string msg) { this.msg = msg; } public readonly string msg; } class Clock { private string msg; private DateTime start; private DateTime stop; public Clock(string msg, int hours, int minutes, int seconds) { this.msg = msg; start = DateTime.Now; TimeSpan duration = new TimeSpan(hours, minutes, seconds); stop = start + duration; } public delegate void SecondChangedHandler(object clock, TimeInfoEventArgs ti); public SecondChangedHandler SecondChanged; public void Run() { for (int i = 0; ; i++) { Console.WriteLine("{0}秒経過", i); DateTime now = DateTime.Now; if (now >= this.stop) { TimeInfoEventArgs ti = new TimeInfoEventArgs(msg); if (SecondChanged != null) { SecondChanged(this, ti); break; } } Thread.Sleep(1000); } } } class DisplayClock { public void Subscribe(Clock clock) { clock.SecondChanged += new Clock.SecondChangedHandler(TimeHasChanged); } public void TimeHasChanged(object clock, TimeInfoEventArgs ti) { Console.WriteLine("{0}", ti.msg); } } class Tester { public void Run() { Console.WriteLine("通知してほしい経過時間を入力"); Console.Write("時間: "); int hours = Convert.ToInt16(Console.ReadLine()); Console.Write("分: "); int minutes = Convert.ToInt16(Console.ReadLine()); Console.Write("秒: "); int seconds = Convert.ToInt16(Console.ReadLine()); Console.Write("経過したときのメッセージ: "); string msg = Console.ReadLine(); Clock clock = new Clock(msg, hours, minutes, seconds); DisplayClock dc = new DisplayClock(); dc.Subscribe(clock); clock.Run(); } static void Main() { Tester t = new Tester(); t.Run(); } }
入出力結果(Console Window)
通知してほしい経過時間を入力 時間: 0 分: 0 秒: 10 経過したときのメッセージ: 10秒経過! 0秒経過 1秒経過 2秒経過 3秒経過 4秒経過 5秒経過 6秒経過 7秒経過 8秒経過 9秒経過 10秒経過 10秒経過! 続行するには何かキーを押してください . . .
ちなみにJavaScriptの場合。
通知して欲しい経過時間
コード(TextWrangler)
var msg = $('#t0').val(); var hours = parseInt($('#t1').val()); var minutes = parseInt($('#t2').val()); var seconds = parseInt($('#t3').val()); var start = new Date(); var stop = new Date(); stop.setHours(start.getHours() + hours); stop.setMinutes(start.getMinutes() + minutes); stop.setSeconds(start.getSeconds() + seconds); var i = 0; var timer = setInterval(function(){ $('#pre0').append(i + "秒経過\n"); if(start >= stop){ $('#pre0').append(msg); clearInterval(timer); } else { i++; start.setSeconds(start.getSeconds() + 1); } }, 1000);
pythonの場合。
sample.py
コード(TextWrangler)
#!/usr/bin/env python3.3 #-*- coding: utf-8 -*- import datetime import time print("通知して欲しい経過時間を入力") print("時: ", end="") hours = int(input()) print("分: ", end="") minutes= int(input()) print("秒: ", end="") seconds = int(input()) print("経過したときのメッセージ: ", end="") msg = input() start = datetime.datetime.today() stop = datetime.datetime(start.year, start.month, start.day, start.hour + hours, start.minute + minutes, start.second + seconds) i = 0 while True: print("{0}秒経過".format(i)) i += 1 now = datetime.datetime.today() if now >= stop: print(msg) break time.sleep(1)
入出力結果(Terminal)
$ ./sample.py 通知して欲しい経過時間を入力 時: 0 分: 0 秒: 10 経過したときのメッセージ: 10秒経過! 0秒経過 1秒経過 2秒経過 3秒経過 4秒経過 5秒経過 6秒経過 7秒経過 8秒経過 9秒経過 10秒経過 10秒経過! $
0 コメント:
コメントを投稿