開発環境
- 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章(デリゲートとイベント)16.12(練習問題)練習7-1を解いてみる。
その他参考書籍
練習17-1.
コード
using System; using System.Threading; class TimeInfoEventArgs : EventArgs { public readonly string message; public TimeInfoEventArgs(string message) { this.message = message; } } class Clock { private DateTime start; private DateTime stop; private string message; public Clock(int hour, int minute, int second, string message) { this.start = DateTime.Now; TimeSpan duration = new TimeSpan(hour, minute, second); this.stop = this.start + duration; this.message = message; } public delegate void SecondChangeHandler (object clock, TimeInfoEventArgs timeInformation); public SecondChangeHandler SecondChanged; public void Run() { for (; ; ) { Thread.Sleep(1000); DateTime dt = DateTime.Now; if (dt >= stop) { TimeInfoEventArgs timeInformation = new TimeInfoEventArgs(this.message); if (SecondChanged != null) { SecondChanged(this, timeInformation); break; } } } } } class DisplayClock { public void Subscribe(Clock theClock) { theClock.SecondChanged += new Clock.SecondChangeHandler(TimeHasChanged); } public void TimeHasChanged(object theClock, TimeInfoEventArgs ti) { Console.WriteLine("DisplayClock: {0}", ti.message); } } class Log { public void Subscribe(Clock theClock) { theClock.SecondChanged += new Clock.SecondChangeHandler(Expired); } public void Expired(object theClock, TimeInfoEventArgs ti) { Console.WriteLine("Log: {0}", 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.Write("経過時に表示するメッセージを入力: "); string message = Console.ReadLine(); Clock clock = new Clock(hour, minute, second, message); DisplayClock dc = new DisplayClock(); dc.Subscribe(clock); Log log = new Log(); log.Subscribe(clock); clock.Run(); } static void Main() { Tester t = new Tester(); t.Run(); } }
入出力結果(Console Window)
通知してほしい経過時間を入力(時間、分、秒) 0 0 10 経過時に表示するメッセージを入力: 10秒経過! DisplayClock: 10秒経過! Log: 10秒経過! 続行するには何かキーを押してください . . .
0 コメント:
コメントを投稿