1. 概要
基本的な部分から・・・。
本ページは、下記のサイトを参考にさせていただきました。
「Thread クラス (System.Threading) 」
「Thread.Sleep メソッド (System.Threading)」
「Mutex クラス (System.Threading) 」
2. Thread
「Thread」は、基本的には、「new」で作成して、「Start」で起動、「Join」で終了を待つ動きになります。
下記のソースを書いて。
#pragma warning disable CS8602
using System;
using System.Threading;
public class Program
{
static public void Main ()
{
myClass myclass = new myClass();
myclass.run();
}
}
public class myClass
{
public myClass() {}
public void run()
{
Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().Name.PadRight(12) + " method start");
Thread thread = new Thread(new ThreadStart(myThread));
thread.Start();
thread.Join();
}
private void myThread()
{
Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().Name.PadRight(12) + " method start");
for(int i=0; i<5; i++)
{
Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().Name.PadRight(12) + " method " + i);
Thread.Sleep(1000);
}
Console.WriteLine(System.Reflection.MethodBase.GetCurrentMethod().Name.PadRight(12) + " method end");
}
}
実行すると、下記の結果が得られます。
run method start
myThread method start
myThread method 0
myThread method 1
myThread method 2
myThread method 3
myThread method 4
myThread method end
3. Thread.Sleep
「Thread.Sleep()」は、スレッド内でなくても使えます。
System.Threading.Thread.Sleep(Int32);
「Int32」で指定した、ミリ秒数の間現在のスレッドを中断します。
「C#」には、「C++」のいわゆる、「Sleep」が存在しないので、これを使用します。
お手軽に使えますが、あまり正確な時間ではないそうです。
4. スレッド ID
System.Threading.Thread.CurrentThread.ManagedThreadId
で、現在の自分のスレッド「ID」(Int32)を取得することができます。
5. オブジェクト
これは、プロパティなのですが
System.Threading.Thread.CurrentThread
が、自分自身のスレッドを指します。
これをどこか、他のスレッドで参照できる位置に置いておけば、他のスレッドからこのスレッドを操作できることになります。
6. Mutex
参考サイトには、「同期プリミティブは、プロセス間の同期にも使用できます」と書いてあります。
ようわかりませんが。
「VC」を使用していた時に、二重起動防止のリリースとして使用していました。
起動時に特定の「Mutex」を作成しておいて、後発に起動しようとして、その「Mutex」が存在していれば、起動しない・・・みたいな。
排他等にも使用できます。
「C#」で、以前使用していた「VC」のプログラムとの間で同期をとる必要があって、使おうと思った次第です。
コンストラクタ。
Mutex (bool initiallyOwned, string name);
1つめの引数が、「true」であれば、所有権を持ちます。
2つめの引数に、名称をつけます。わたしは、プリフィックスに「Global\」をつけています。
Mutex (bool initiallyOwned, string name);
下記のように書けば。
Mutex Mutex = new Mutex(true, @"Global\Hogehoge");
・・・略・・・
Mutex.ReleaseMutex();
最初の行で、「Mutex」を確保して、最後の行で開放することになるようです。