- ベストアンサー
C#のスレッドに上位から値を渡す方法
- C#でスレッドに上位から値を渡す方法について知りたい。
- 装置の制御に使われるスレッドに、上位から値を渡す方法について教えてください。
- C#のスレッドに上位から値を渡す方法について教えてください。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
> static int ctrlCmd = 0; > でコマンド変数を定義し、 > スレッドからこの変数を参照しています。 > これは作法的に誤りではないでしょうか? この作りだと,ctrlCmdはDevice.ComThreadクラスの非staticなフィールドにすると思います。 Deviceのstaticであるということは,全Deviceインスタンス・全Device.ComThreadインスタンスに対して1つしか持てなくなりますが, クラスの構造は,Deviceは複数,さらに1つのDeviceに対してDevice.ComThreadが複数,という作りのように見えます。 この構造とctrlCmdの状況が合っていないので,コードを読んでいて不思議に感じます。
その他の回答 (1)
- Yune-Kichi
- ベストアンサー率74% (465/626)
まず,スレッドはメモリ空間が分離していないですから,同期や排他の問題はともかく,フィールドに書き込めば他のスレッドから参照可能です。 使い方によっては,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
お礼
回答をありがとうございます。 すこし光が見えてきました。 > スレッドはメモリ空間が分離していないですから,同期や排他の問題はともかく,フィールドに書き込めば他のスレッドから参照可能です ということから、以下のように修正してみました。 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); } } } } 教えてくださったリンク、大変参考になります。 排他やキューなど、これからまだまだ覚えないといけないことがあるようです。 プログラミングに興味があり、これからも勉強していきたいと思います。
お礼
この度はいろいろとありがとうございました。 なんとか次の段階に進むことができそうです。 スレッドひとつとっても、 いろいろな実現方法があるようで、 排他のことも考えないといけないし、 さらには、スレッド中から発行したイベントの中でボタンのEnabledを変更しようとすると例外が発生したりと、 まだまだ知らないといけない事柄がありますが、 なんとかやっていきたいと思います。 どうもありがとうございました。
補足
度々本当にありがとうございます。 確かにご指摘のとおりです。 static の意味の理解がよくできていませんでした。 Device クラスは複数存在し、 その中にひとつの UDPThread スレッドがあるようにしたかったのです。 UDPThread を static にしているとctrlCmd にアクセスできないので、 UDPThread の static も外しました。 動作しているようですが、行儀のよいコーディングかどうか分かりません。