開発環境
- Microsoft Windows 7 Home Premium (OS)
- Microsoft Visual C# 2010 Express Edition (IDE)
- 言語: C#
『初めてのC# 第2版』(Jesse Liberty+Brian MacDonald著、日向俊二訳、オライリー・ジャパン、2006年、ISBN978-487311-294-7)の 第17章(デリゲートとイベント)17.6(練習問題)、問題17-2を解いてみる。
問題17-2.
コード
using System; using System.Threading; namespace Sample { class TimeInfoEventArgs : EventArgs { public readonly string msg; public TimeInfoEventArgs(string msg) { this.msg = msg; } } class Clock { private DateTime start; private DateTime stop; private string msg; public Clock(int hours, int minutes, int seconds, string msg) { start = DateTime.Now; TimeSpan duration = new TimeSpan(hours, minutes, seconds); stop = start + duration; this.msg = msg; } public delegate void SecondChangeHandler (object Clock, TimeInfoEventArgs ti); public SecondChangeHandler SecondChanged; public void Run() { for(int i = 0;;i++) { Console.Write("{0}秒, ", i); Thread.Sleep(1000); DateTime dt = DateTime.Now; if (dt >= this.stop) { TimeInfoEventArgs ti = new TimeInfoEventArgs(this.msg); if (SecondChanged != null) { SecondChanged(this, ti); break; } } } } } class DisplayClock { public void Subscribe(Clock clock) { clock.SecondChanged = new Clock.SecondChangeHandler(TimeHasChanged); } public void TimeHasChanged(object clock, TimeInfoEventArgs ti) { Console.WriteLine(ti.msg); } } class Tester { public void Run() { Console.Write("メッセージを入力: "); string msg = Console.ReadLine(); Console.WriteLine("時、分、秒を入力"); int hours = Convert.ToInt16(Console.ReadLine()); int minutes = Convert.ToInt16(Console.ReadLine()); int seconds = Convert.ToInt16(Console.ReadLine()); Clock clock=new Clock(hours,minutes,seconds,msg); DisplayClock dc = new DisplayClock(); dc.Subscribe(clock); clock.Run(); } static void Main() { Tester t = new Tester(); t.Run(); } } }
入出力結果(Console Window)
メッセージを入力: 時間が経過しました! 時、分、秒を入力 0 0 15 0秒, 1秒, 2秒, 3秒, 4秒, 5秒, 6秒, 7秒, 8秒, 9秒, 10秒, 11秒, 12秒, 13秒, 14秒, 時間が経過しました! 続行するには何かキーを押してください . . .
0 コメント:
コメントを投稿