CaptureSound Managed その4

1. Threadを調べる

   DirectX9.0  sample  CaptureSoundでは、CaptureBufferから読み込んで、fileに書き込むのに、別スレッドを使います。

私は、スレッドを使うような、高級な事を、したことが、ありません。

この機会に、スレッドを、調べました。

 

            Thread thread1 = new Thread(new ThreadStart(mythread1));

            thread1.IsBackground = true;

            thread1.Start();

 

たった、これだけ! うーん、うれしいにゃ  (^_^)

全て、.NETマルチスレッド・プログラミング入門の、お陰です、有難う御座いますm(__)m

スレッドの事なら、上記の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