非IT企業に勤める中年サラリーマンのIT日記

非IT企業でしかもITとは全く関係ない部署にいる中年エンジニア。唯一の趣味がプログラミングという”自称”プログラマー。

C#: タスクトレイに常駐して一定間隔で処理を実行させる方法

   

前回、タスクトレイに常駐するアプリの作り方を紹介しました。

今回は、この状態で一定間隔に処理を実行する方法について書きます。この処理にはスレッッド(Threadクラス)を使います。

今回の完成形

前回同様、タスクトレイにアプリを常駐させます。

 

今回は10秒間隔で以下のようにメッセージボックスを表示させるようにしました。これは一定間隔に処理できたことを示すもので、あくまで便宜上のものです。何か一定間隔で処理をさせる場合はここにコードを書けば良いわけです。

 

処理待機中でも終了はできます。スレッドを使わないとこれができないんです。フリーズしたみたいになります。ここが今回の肝。

[ad#top-1]

ソースコード

ソース全文はこちらです。こいつをコピペしてコンパイルすれば上で説明した動きをするアプリができます。前回のソースコードをベースにしています。//追加と書かれているところが今回の追加部分です。

using System;
using System.Drawing;
using System.Windows.Forms;
using System.Threading;  //追加

class MainWindow{
  static void Main(){
    ResidentTest rm = new ResidentTest();
    Application.Run();
  }
}

class ResidentTest : Form{
  private Thread thread; //追加

  public ResidentTest(){
    this.ShowInTaskbar = false;
    this.setComponents();

    thread = new Thread(intervalCheck); //追加
    thread.Start();  //追加
  }

  private void Close_Click(object sender, EventArgs e){
    thread.Abort();  //追加
    Application.Exit();
  }

  //以下追加
  private void intervalCheck(){
    while(true){
      System.Threading.Thread.Sleep(10000);
      MessageBox.Show("Test");
    }
  }

  private void setComponents(){
    NotifyIcon icon = new NotifyIcon();
    icon.Icon = new Icon("app.ico");
    icon.Visible = true;
    icon.Text = "常駐アプリテスト";
    ContextMenuStrip menu = new ContextMenuStrip();
    ToolStripMenuItem menuItem = new ToolStripMenuItem();
    menuItem.Text = "&終了";
    menuItem.Click += new EventHandler(Close_Click);
    menu.Items.Add(menuItem);

    icon.ContextMenuStrip = menu;
  }
}
 

 

ソースコード解説

前回から新たに加わった部分として、以下のようにThreadクラスを使っています。threadオブジェクトは他のメソッドで使えるようにインスタンス変数化しています。
コンストラクタに投げているintervalCheckは、実行するメソッド名です。

thread = new Thread(intervalCheck);
thread.Start();
 

 

スレッドで実行するintervalCheckの部分です。while分で無限ループしていますが、Thread.Sleep(10000);のところで10秒間止めるようにしています。この時間間隔は任意です。次の行でメッセージボックスを表示させていますが、こちらはあくまで便宜上のもので、ここのところに一定間隔で処理する内容を書きます。

private void intervalCheck(){
  while(true){
    Thread.Sleep(10000);
    MessageBox.Show("Test");
  }
}
 

 

アプリの終了イベントにも1行加えます。終了命令前にthread.Abort();を加えます。これがないとスレッドが終わらず永遠に終了できません。無いと無限ループに陥りますので必ず書いてください。

private void Close_Click(object sender, EventArgs e){
  thread.Abort();
  Application.Exit();
}
 

 

先ほど説明した通り、実行すると10秒間隔でメッセージボックスが現れますが、アプリはきちんと終了できます。一定間隔に処理をさせるためにループを使っているので、スレッドを使わないとループ中はフリーズしたような状態になってしまいます。

[ad#ad-1]

スポンサーリンク

 - C#応用編