
パソコンで作業をしているとき、時間を忘れてしまうことはありませんか?
作業をするときはただ時間をかければよいというものではなく、適度に休憩をすることも必要です。そのほうが休憩時間をいれたとしても早く作業を終わらせることができます。
ポモドーロ・テクニックとは?
「ポモドーロ・テクニック」という言葉を聞いたことがあるでしょうか。これは時間管理術のひとつで、仕事や勉強、家事などのタスクを25分間続けた後に5分の休憩を取り、そのサイクルを最大4回続けるというものです。
ポモドーロとはイタリア語で「トマト」のことです。この時間管理術を考案したのはイタリア出身のフランチェスコ・シリロという人物なのですが、彼はトマト型のキッチンタイマーをつかって時間を区切って試験勉強をしたといわれています。
シリロは休憩時間、持続可能な回数などを研究し続け、人間がもつ最大限の生産性と効率性を引き出すことができる時間が「25分間続けた後に5分の休憩」であるという結論を得ることになったのです。
ではポモドーロ・テクニックを実践することができるアプリをつくってみましょう。(ここまでは全部前振りでした) ポモドーロ・テクニックに関するネタ元 ⇒ ポモドーロ・テクニック:世界が実践する時間管理術はこうして生まれた | ニューズウィーク日本版 オフィシャルサイト
アプリの作成
以下のような動作をするアプリを作成します。
[開始ボタン]を押す
25分後に休憩
[休憩ボタン]を押す
5分後に作業再開
[開始ボタン]を押す
これを4回繰り返す
そのあと20~30分の休憩
[開始ボタン]をおすと「○時○分まで作業をしてください」
25分経つと「休憩してください」
[休憩ボタン]を押すと「○時○分まで休憩してください」
5分経つと「○回目の作業を開始してください」
これらを4回繰り返すと「30分の休憩をしてください」と表示させる
タイマーを使う
作業を開始して25分が経過したかどうか、休憩を開始してから5分が経過したかどうかはタイマーをつかって調べます。開始時刻にタイマーはスタートし、定められた時間になるとメッセージを表示してタイマーは止まります。
最初は[開始ボタン]ボタンしか押せないようにしておきます。そして[開始ボタン]をおすと[開始ボタン]も[休憩ボタン]も押せなくなり、「○時○分まで作業に集中しましょう」と表示されます。

背景色は目に優しい緑色です。笑
コンストラクタとフィールド変数
まずタイマーをふたつ作成します。そして10秒ごとに現在時刻を調べて、必要ならメッセージを表示させます。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 | public partial class Form1 : Form {     // フィールド変数     int count = 0;     Timer timerTask = new Timer();     Timer timerRest = new Timer();     // 作業開始から15分後、休憩開始から5分後     DateTime endDt = new DateTime();     public Form1()     {         InitializeComponent();         timerTask.Interval = 10 * 1000;         timerTask.Tick += TimerTask_Tick;         timerRest.Interval = 10 * 1000;         timerRest.Tick += RestTask_Tick;         buttonRest.Enabled = false; // 休憩開始のボタンは押せなくする         label1.Text = String.Format("{0}回目の作業を始めてください", count + 1);         label2.Text = "";     } } | 
イベントハンドラ
これは[作業開始]ボタンがクリックされたときのイベントハンドラです。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | public partial class Form1 : Form {     private void buttonStart_Click(object sender, EventArgs e)     {         count++;         // 25分後がいつになるか計算して endDtに格納する         DateTime now = DateTime.Now;         endDt = now.AddMinutes(25);         // 25分後が何時何分か表示する         string str = String.Format("{0} まで作業をしましょう。", endDt.ToString("HH 時 mm 分"));         string str1 = String.Format("{0} 回目", count);         label1.Text = str;         label2.Text = str1;         // ボタンは押せなくする         buttonRest.Enabled = false;         buttonStart.Enabled = false;         // タイマーをスタートさせる         timerTask.Start();     } } | 
[作業開始]ボタンがクリックされるとタイマーが起動します。これはそのタイマー関連のイベントハンドラです。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | public partial class Form1 : Form {     private void TimerTask_Tick(object sender, EventArgs e)     {         DateTime now = DateTime.Now;         // 時間になったら休憩するようにメッセージを表示する         if(endDt < now)         {             string str = String.Format("{0}回目 終了 休憩してください", count);             label1.Text = str;             // フォームが最小化、非表示の場合は表示させる             ShowForm();             // [休憩する]のボタンだけおせるようにする             buttonRest.Enabled = true;             buttonStart.Enabled = false;             // タイマーは止める             timerTask.Stop();         }     } } | 
休憩時間になると[休憩する]ボタンが押せるようになります。これは[休憩する]ボタンが押されたときのイベントハンドラです。1セット終わったら長めの休憩時間をとるようにしています。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | public partial class Form1 : Form {     private void buttonRest_Click(object sender, EventArgs e)     {         // 4回1セット。1セット終わったら30分の休憩。         // それ以外は5分の休憩         DateTime now = DateTime.Now;         if(count % 4 != 0)             endDt = now.AddMinutes(5);         else         {             count = 0;             endDt = now.AddMinutes(30);         }         // メッセージの表示         string str = String.Format("{0} まで休憩しましょう。", endDt.ToString("HH 時 mm 分"));         label1.Text = str;         // 休憩時間のカウント開始         timerRest.Start();     } } | 
[休憩する]ボタンがクリックされると休憩時間を管理するためのタイマーが起動します。これはそのタイマー関連のイベントハンドラです。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | public partial class Form1 : Form {     // 休憩時間が終わったらその旨を表示する     private void RestTask_Tick(object sender, EventArgs e)     {         DateTime now = DateTime.Now;         if(endDt < now)         {             string str = String.Format("休憩時間は終わりました\n{0}回目の作業を始めてください", count+1);             label1.Text = str;             ShowForm();             buttonStart.Enabled = true;             buttonRest.Enabled = false;         }     } } | 
うっかり終了させないようにする
これだけでもよいのですが、作業中にうっかりアプリを終了させてしまうかもしれません。そこで右上の「×」ボタンをクリックしても終了しないようにします。「×」ボタンをクリックするとタスクトレイに入ります。
これで「×」ボタンをクリックしてもフォームが見えなくなるだけでアプリが終了することはありません。ただこれでは本当に終了させたいときに終了させることができません。
| 1 2 3 4 5 6 7 8 9 | public partial class Form1 : Form {     private void Form1_FormClosing(object sender, FormClosingEventArgs e)     {         // これではダメ!         e.Cancel = true;         this.Visible = false;     } } | 

まずNotifyIconを追加します。そして以下のように通知アイコンをクリックすれば非表示になっているフォームを再表示させることができるようになります。
| 1 2 3 4 5 6 7 | public partial class Form1 : Form {     private void notifyIcon1_MouseClick(object sender, MouseEventArgs e)     {         this.Visible = true;     } } | 
本当に終了させたいときは「×」ボタンをクリックする以外の方法を用意する必要があります。isEndというフラグを使ってメニューで[終了]が選択されたときにisEnd = true;とします。そしてアプリケーションを終了させるためにApplication.Exit();を実行します。すると終了させることができます。
| 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | public partial class Form1 : Form {     bool isEnd = false;     private void Form1_FormClosing(object sender, FormClosingEventArgs e)     {         if(isEnd)         {             return;         }         e.Cancel = true;         this.Visible = false;         this.TopMost = false;     }     private void ExitMenuItem_Click(object sender, EventArgs e)     {         isEnd = true;         Application.Exit();     } } | 
休憩の時間になったときにフォームが最小化されていたり非表示になっていると、メッセージが表示されても気づくことができません。メッセージを表示するときはフォームを見えるように表示させます。
| 1 2 3 4 5 6 7 8 9 | public partial class Form1 : Form {     void ShowForm()     {         this.Visible = true;         this.TopMost = true;         this.WindowState = FormWindowState.Normal;     } } | 
