開発環境
- 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-1を解いてみる。
問題 17-1
コード
using System; using System.Threading; namespace Sample { public class TimeInfoEventArgs : EventArgs { private string message; public TimeInfoEventArgs(string message) { this.message = message; } public string Message { get { return message; } } } public class Clock { private DateTime start; private DateTime stop; private string message; public Clock(int hour, int minute, int second, string message) { start = DateTime.Now; TimeSpan duration = new TimeSpan(hour, minute, second); stop = start + duration; this.message = message; } 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 >= stop) { TimeInfoEventArgs ti = new TimeInfoEventArgs(message); if (SecondChanged != null) { Console.WriteLine(); SecondChanged(this, ti); break; } } } } } public class DisplayClock { public void Subscribe(Clock clock) { clock.SecondChanged += new Clock.SecondChangeHandler(TimeHasChanged); } public void TimeHasChanged(object clock, TimeInfoEventArgs ti) { Console.WriteLine(ti.Message); } } class Tester { public void Run() { Console.WriteLine("通知する経過時間(時、分、秒)を入力"); int hour = Convert.ToInt16(Console.ReadLine()); int minute = Convert.ToInt16(Console.ReadLine()); int second = Convert.ToInt16(Console.ReadLine()); Console.WriteLine("メッセージを入力"); string message = Console.ReadLine(); Clock clock = new Clock(hour, minute, second, message); DisplayClock dc = new DisplayClock(); dc.Subscribe(clock); clock.Run(); } static void Main() { Tester t = new Tester(); t.Run(); } } }
入出力結果(Console Window)
通知する経過時間(時、分、秒)を入力 0 0 10 メッセージを入力 Hello, World! 0秒 1秒 2秒 3秒 4秒 5秒 6秒 7秒 8秒 9秒 Hello, World! 続行するには何かキーを押してください . . .
0 コメント:
コメントを投稿