• ベストアンサー
※ ChatGPTを利用し、要約された質問です(原文:C# のスレッドに、上位から値を渡すには?)

C#のスレッドに上位から値を渡す方法

このQ&Aのポイント
  • C#でスレッドに上位から値を渡す方法について知りたい。
  • 装置の制御に使われるスレッドに、上位から値を渡す方法について教えてください。
  • C#のスレッドに上位から値を渡す方法について教えてください。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.2

>  static int ctrlCmd = 0; > でコマンド変数を定義し、 > スレッドからこの変数を参照しています。 > これは作法的に誤りではないでしょうか? この作りだと,ctrlCmdはDevice.ComThreadクラスの非staticなフィールドにすると思います。 Deviceのstaticであるということは,全Deviceインスタンス・全Device.ComThreadインスタンスに対して1つしか持てなくなりますが, クラスの構造は,Deviceは複数,さらに1つのDeviceに対してDevice.ComThreadが複数,という作りのように見えます。 この構造とctrlCmdの状況が合っていないので,コードを読んでいて不思議に感じます。

ogu-ne
質問者

お礼

この度はいろいろとありがとうございました。 なんとか次の段階に進むことができそうです。 スレッドひとつとっても、 いろいろな実現方法があるようで、 排他のことも考えないといけないし、 さらには、スレッド中から発行したイベントの中でボタンのEnabledを変更しようとすると例外が発生したりと、 まだまだ知らないといけない事柄がありますが、 なんとかやっていきたいと思います。 どうもありがとうございました。

ogu-ne
質問者

補足

度々本当にありがとうございます。 確かにご指摘のとおりです。 static の意味の理解がよくできていませんでした。 Device クラスは複数存在し、 その中にひとつの UDPThread スレッドがあるようにしたかったのです。 UDPThread を static にしているとctrlCmd にアクセスできないので、 UDPThread の static も外しました。 動作しているようですが、行儀のよいコーディングかどうか分かりません。

その他の回答 (1)

回答No.1

まず,スレッドはメモリ空間が分離していないですから,同期や排他の問題はともかく,フィールドに書き込めば他のスレッドから参照可能です。 使い方によっては,BlockingCollection http://msdn.microsoft.com/ja-jp/library/dd267312.aspx やConcurrentQueue http://msdn.microsoft.com/ja-jp/library/dd267265.aspx など,System.Collections.Concurrentのコレクションが役立つかと思います。 APIに似た方式では,System.ThreadingにAutoResetEventやManualResetEventといった同期用のクラス, http://msdn.microsoft.com/ja-jp/library/system.threading.autoresetevent.aspx http://msdn.microsoft.com/ja-jp/library/system.threading.manualresetevent.aspx MonitorやSemaphoreといった排他用のクラス http://msdn.microsoft.com/ja-jp/library/system.threading.monitor.aspx http://msdn.microsoft.com/ja-jp/library/system.threading.semaphore.aspx が存在しますし,Interlockedクラスとintフィールドによる同期/排他も可能です。 http://msdn.microsoft.com/ja-jp/library/system.threading.interlocked.aspx

ogu-ne
質問者

お礼

回答をありがとうございます。 すこし光が見えてきました。 > スレッドはメモリ空間が分離していないですから,同期や排他の問題はともかく,フィールドに書き込めば他のスレッドから参照可能です ということから、以下のように修正してみました。  static int ctrlCmd = 0; でコマンド変数を定義し、 スレッドからこの変数を参照しています。 これは作法的に誤りではないでしょうか? (排他に関しては無視しています。) (抜粋) class Device  {    static int ctrlCmd = 0; ← ★★★ 追加 ★★★    // 装置運転開始    public void Start() {      ComThread comThread = new ComThread();      comThread.Start();    }    class ComThread    {      public void Start()        var udpThread = Task.Factory.StartNew(()=>UDPThread());      }      public void Stop()        // スレッド停止処理      }      public void Control(int cmd)        ctrlCmd = cmd; ← ★★★ 追加 ★★★      }      static void UDPThread()      {        for (;;) {          if (ctrlCmd == 1) { ← ★★★ 追加 ★★★            // コマンド送信            制御コマンド送信~レスポンス受信          }          Thread.Sleep(1000);        }      }    }  } 教えてくださったリンク、大変参考になります。 排他やキューなど、これからまだまだ覚えないといけないことがあるようです。 プログラミングに興味があり、これからも勉強していきたいと思います。

関連するQ&A