CaptureSound Managed その
41. Threadを調べる
DirectX9.0 sample CaptureSoundでは、CaptureBufferから読み込んで、fileに書き込むのに、別スレッドを使います。
私は、スレッドを使うような、高級な事を、したことが、ありません。
この機会に、スレッドを、調べました。
Thread thread1 = new Thread(new ThreadStart(mythread1));
thread1.IsBackground = true;
thread1.Start();
たった、これだけ! うーん、うれしいにゃ (^_^)
スレッドの事なら、上記のwebページが、最高に、いいです。
mythread1 は、thread1で動作する内容が、書かれています。
using
System;using
System.Collections.Generic;using
System.Text;using
System.Threading;namespace
mythread1{
class Program
{
static void Main(string[] args)
{
Thread thread1 = new Thread(new ThreadStart(mythread1));
thread1.IsBackground = true;
thread1.Start();
for (int i = 0; i < 100; i++)
{
Thread.Sleep(5); //ここでのThreadは、メインスレッドの事
Console.Write("main "+i+" ");
}
Console.ReadLine();
}
static void mythread1()
{
for (int i = 0; i < 100; i++)
{
Thread.Sleep(5); //これは、thread1、これを書いた、スレッドの事
Console.Write("thread "+ i +" ");
}
}
}
}
結果は、こうなります。
2. AutoReset Event
AutoResetEvnetの他に、ManualRestEventと、言うものが、あります。
この件につきましては、.NETプログラミング研究 のお力をお借りいたしました、ありがとうございます m(__)m
public static ManualResetEvent manualEvent;
と、して、ManualResetEventを、作っておきます。
manualEvent=new ManualResetEvent(false);
そして、waitさせたいスレッドに
manualEvent.WaitOne();
と、書いておくと、
Eventが発生するまで、じっと待ち続けます。(今の場合、メインプログラムのスレッドが、待っていることに、なります。)
別スレッドを立てておいて、別スレッドをスタートさせます。
Thread t1=new Thread(new ThreadStart(MyMethod));
t1.Name="1";
t1.Start();
そして、この別スレッドで、MyMethod()内に
manualEvent.Set();
書いておくと、
このタイミングで、待機していたメインのスレッドが、動き始めます。
manualEvent.Set();
が、トリガーに、なる訳です。
同じ場所で、もう一回待つようにするには
manualEvent.WaitOne(); に、続けて
manualEvent.Reset();
と、書いておきます。
そうすると、また、
manualEvent.Set();
が、次に、起動されるまで、再び待つわけですね。
AutoResetEventは、
この
manualEvent.WaitOne();
manualEvent.Reset();
と、書くことが不要な、自動的にResetされるEvent、で、あるようです。
manualEvent.Reset();
を、書く必要がない、ようです。
using System;
using
System.Collections.Generic;using
System.Text;using
System.Threading;namespace
thread_2{
class Program
{
public static ManualResetEvent manualEvent;
static void Main(string[] args)
{
//non-signal state ManualResetEvent create
manualEvent=new ManualResetEvent(false);
// create thread and start
Thread t1=new Thread(new ThreadStart(MyMethod));
t1.Name="1";
t1.Start();
//do block thread until signaled
manualEvent.WaitOne();
Console.WriteLine("main thread end");
Console.ReadLine();
}
public static void MyMethod()
{
Console.WriteLine("{0}:thread start",Thread.CurrentThread.Name);
//do some work
Thread.Sleep(1000);
//make signaled state
manualEvent.Set();
Console.WriteLine("{0}:thread end",Thread.CurrentThread.Name);
}
}
}
実行結果
ただ、なんとか、理解できただけで、どうも、「地に付かん」けど
次は Notifyを調べましょう。
H/18.6.28