Netduinoがきましたの続きになります。
マルチスレッドで遊んでみました。マルチスレッドがあると並列実行(実際はCPUは一つなので時分割で交互に動作)を簡単に記述できます。
以下の例題では、2つのLEDを、LED1はスレッドで250ミリ秒毎、LED2はメインスレッドで150ミリ秒毎に反転します。
スレッドを使うには、まず準備として「using System.Threading;」をすることでThreadクラスを使えるようにします。
次に「Thread thread = new Thread(flash);」とすることでスレッドを実行するメソッド(flash)を指定します。スレッドを実行するメソッドはvoid f()という形でないといけません。この段階ではスレッド自体はスタートしていません。
最後に「thread.Start();」とすることでスレッドが実行開始されます。この段階で処理は2つに分かれて並列実行(CPUは一つなので時分割で交互に実行)されます。
すごく簡単です。
今回はスレッドの優先順位を変えたりとか、スレッドの終了待ちとかをしないので、「new Thread(flash).Start();」のように書いても動きます。1行で済んじゃいます。
残念ながら、RTOSのかわりに使えるほどではありません。RTOS(リアルタイムOS)は時間制約に関する最悪値が保証されていますが、.Net Microframeworkでは保証されていません。RTOS的な機能が必要なときは、RTOS上に.Net Microframeworkを実装することになるみたいです。例えば日立超LSIでT-Kernel上に.Net Microframeworkを載せるというソリューションを提供しています(ニュースリリース)。
通常の.Net Frameworkではdelegateを作ってBeginInvokeをする方法でもマルチスレッドを実現できるそうですが、.Net Micro Frameworkで動かそうとするとサポートしていないというエラーが出て実行できませんでした。
参考にしたのは以下の3つの記事です。
@ITの連載「.NETマルチスレッド・プログラミング入門」
PS3とLinux、電子工作もさんのブログ「FEZ Dominoでマルチスレッドを動かす」
TinyCLRの「Beginners Guide to C# and .NET Micro Framework」(pdf)のThreadingの章
マルチスレッドで遊んでみました。マルチスレッドがあると並列実行(実際はCPUは一つなので時分割で交互に動作)を簡単に記述できます。
以下の例題では、2つのLEDを、LED1はスレッドで250ミリ秒毎、LED2はメインスレッドで150ミリ秒毎に反転します。
using System; using System.Threading; // Thread using Microsoft.SPOT; // Debug using Microsoft.SPOT.Hardware; // OutputPort using SecretLabs.NETMF.Hardware; using SecretLabs.NETMF.Hardware.Netduino; // Pins namespace ThreadTest1 { public class Program { static OutputPort LED1 = new OutputPort(Pins.ONBOARD_LED, false); static OutputPort LED2 = new OutputPort(Pins.GPIO_PIN_D13, false); public static void Main() { // write your code here Debug.Print("Hello, Multi-Threading"); Thread thread = new Thread(flash); // 新しいスレッドの作成 thread.Start(); // スレッドの実行開始(ここで実行が並列になる) // 本スレッド側でもLED2をチカチカ // 無限ループ while (true) { LED2.Write(!LED2.Read()); // LED2反転 Thread.Sleep(150); // 150ミリ秒待つ } } // スレッド本体 static void flash() { // 無限ループ while (true) { LED1.Write(!LED1.Read()); // LED1反転 Thread.Sleep(250); // 250ミリ秒待つ } } } }
スレッドを使うには、まず準備として「using System.Threading;」をすることでThreadクラスを使えるようにします。
次に「Thread thread = new Thread(flash);」とすることでスレッドを実行するメソッド(flash)を指定します。スレッドを実行するメソッドはvoid f()という形でないといけません。この段階ではスレッド自体はスタートしていません。
最後に「thread.Start();」とすることでスレッドが実行開始されます。この段階で処理は2つに分かれて並列実行(CPUは一つなので時分割で交互に実行)されます。
すごく簡単です。
今回はスレッドの優先順位を変えたりとか、スレッドの終了待ちとかをしないので、「new Thread(flash).Start();」のように書いても動きます。1行で済んじゃいます。
残念ながら、RTOSのかわりに使えるほどではありません。RTOS(リアルタイムOS)は時間制約に関する最悪値が保証されていますが、.Net Microframeworkでは保証されていません。RTOS的な機能が必要なときは、RTOS上に.Net Microframeworkを実装することになるみたいです。例えば日立超LSIでT-Kernel上に.Net Microframeworkを載せるというソリューションを提供しています(ニュースリリース)。
通常の.Net Frameworkではdelegateを作ってBeginInvokeをする方法でもマルチスレッドを実現できるそうですが、.Net Micro Frameworkで動かそうとするとサポートしていないというエラーが出て実行できませんでした。
参考にしたのは以下の3つの記事です。
@ITの連載「.NETマルチスレッド・プログラミング入門」
PS3とLinux、電子工作もさんのブログ「FEZ Dominoでマルチスレッドを動かす」
TinyCLRの「Beginners Guide to C# and .NET Micro Framework」(pdf)のThreadingの章
※コメント投稿者のブログIDはブログ作成者のみに通知されます