C#スレッド間のデータ共有方法

このQ&Aのポイント
  • C#でメインプロセスと生成されたスレッド間でデータの共有をする方法について解説します。
  • 例えば、メインプロセスと生成されたスレッドで変数の値を読み書きする方法を紹介します。
  • 具体的なコード例を示しながら、C#でのスレッド間のデータ共有の手法を説明します。
回答を見る
  • ベストアンサー

c# スレッド間でのデータの共有

C#でメインプロセスと生成されたスレッド間でデータの共有をさせたいのですがどのようにすればいいのでしょうか。ご教授お願い致します。 ・メインプロセス(A) ・Aから生成されたスレッド(B) 例えば、AとBで変数の値をそれぞれ読み書きさせたい場合 どのようにすればよいのでしょうか。 class TEST { public int flag; // メインプロセス(A) public static void Main() { Thread t = new Thread(new ThreadStart(abc)); t.IsBackground = true; t.Start(); while(ture) { Thread.Sleep(10); Console.WriteLine("A:{0}",flag); } } // Aから生成されたスレッド(B) public void abc() { Console.WriteLine("B:{0}",flag); flag++; } }

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

  • ベストアンサー
  • ape5
  • ベストアンサー率57% (85/148)
回答No.1

Mutexを使えばよいのではないでしょうか。 class TEST { public int flag; private static Mutex mx = new Mutex(false,"myMutex"); // メインプロセス(A) public static void Main() { Thread t = new Thread(new ThreadStart(abc)); t.IsBackground = true; t.Start(); while(ture) { mx.WaitOne(); Thread.Sleep(10); Console.WriteLine("A:{0}",flag); mx.ReleaseMutex(); } } // Aから生成されたスレッド(B) public void abc() { mx.WaitOne(); Console.WriteLine("B:{0}",flag); flag++; mx.ReleaseMutex(); } } //なお動かしてはいませんので、うまく動かないこともあるかもしれません。

関連するQ&A

  • C#のnew Thread以下のコード分解

    new Thread以下のコードを分解できますか? ====================== private void button1_Click(object sender,EventArgs e) { new Thread(new ThreadStart(delegate() { AllocConsole(); //開始============== for(uint i = 0;i < 100;++i) { Console.WriteLine("Hello " + i); } FreeConsole(); //終了============== })).Start(); } =================== 以上

  • C#で引数を渡して、スレッド用の関数をよびだすには?

    C#でスレッドを使う場合、引数が渡せません。 具体的には、 Thread temp=new Thread(new ThreadStart(message)); temp.Start(); private void message(){ ~} と、なり、ThreadStart(message)の部分で、 ThreadStart(message(mystr))とし、 private void message(string s){} 書くことができないのです。 しかし、関数に、引数を渡せないのは、不便です。 何か、方法は、ないでしょうか。

  • C# スレッド終了の監視について

    お世話になります。 C#2005でプログラムを作成しております。 マルチスレッドでの、スレッドの終了の監視のことでご質問させていただきます。 下記のコードを実行すると、問題なく実行されます。 ------------------------------------------------------------------------------------ private int SetDataTreeView() { Thread RcvSetThread = new Thread(new ThreadStart(this.RcvDataSet)); RcvSetThread.Start(); } delegate void RcvDataSetDelegate(); void RcvDataGridSet() { /* フォーム内のDatagidviewへの値の代入 */ } void RcvDataSet() { Invoke(new RcvDataSetDelegate(RcvDataGridSet)); } ------------------------------------------------------------------------------------ このスレッドの終了を監視したく、下記のコードを追加してデバッグしてみましたが、 スレッドが実行されませんでした。 ------------------------------------------------------------------------------------ int isRcvSearchFlg = 0; private int SetDataTreeView() { Thread RcvSetThread = new Thread(new ThreadStart(this.RcvDataSet)); RcvSetThread.Start(); // スレッドが終了するまで待機する for (; ; ) { if (isRcvSearchFlg == 1) { break; } } } delegate void RcvDataSetDelegate(); void RcvDataGridSet() { /* フォーム内のDatagidviewへの値の代入 */ isRcvSearchFlg = 1; } void RcvDataSet() { Invoke(new RcvDataSetDelegate(RcvDataGridSet)); } ------------------------------------------------------------------------------------ また、以下も試してみましたが、結果は同じでした。 ------------------------------------------------------------------------------------ private int SetDataTreeView() { Thread RcvSetThread = new Thread(new ThreadStart(this.RcvDataSet)); RcvSetThread.Start(); // スレッドが終了するまで待機する RcvSetThread.Join(); } delegate void RcvDataSetDelegate(); void RcvDataGridSet() { /* フォーム内のDatagidviewへの値の代入処理 */ } void RcvDataSet() { Invoke(new RcvDataSetDelegate(RcvDataGridSet)); } ------------------------------------------------------------------------------------ スレッドの終了を監視する方法がわからず困っております。 お手数ですが、ご教授いただきたくよろしくお願い申し上げます。

  • 2つのスレッドの実行について

    お世話になります。 VS2005C#で作成しております。 以下のコードにてスレッドを2つ実行させ、終了を監視する処理を記述しました。 ----------------------------------------------------------------------------------------------------------- isRcvSearchFlg = 0; isFwdSearchFlg = 0; private int SetDataTreeView() { // それぞれのデータ格納処理をスレッドで処理する Thread RcvSetThread = new Thread(new ThreadStart(this.RcvDataSet)); Thread FwdSetThread = new Thread(new ThreadStart(this.FwdDataSet));   RcvSetThread.Start(); FwdSetThread.Start(); // 両方のスレッドが終了するまで待機する while (isRcvSearchFlg != 1 && isFwdSearchFlg != 1) Application.DoEvents(); } delegate void RcvDataSetDelegate(); void RcvDataGridSet() { /* メインフォーム内のDatagidview(1)への値の代入 */ isRcvSearchFlg = 1; } void RcvDataSet() { Invoke(new RcvDataSetDelegate(RcvDataGridSet)); } delegate void FwdDataSetDelegate(); private void FwdDataGridSet() { /* メインフォーム内のDatagidview(2)への値の代入 */ isRcvSearchFlg = 1; } void FwdDataSet() { Invoke(new FwdDataSetDelegate(FwdDataGridSet)); } ----------------------------------------------------------------------------------------------------------- RcvDataGridSet、FwdDataGridSetでログを出力して、進行状況を監視しておりますが、どうも2つのスレッドが同時に走っていないようなのです。 原因として考えられることはございますでしょうか。 また、同時に走らせるコードはありますでしょうか。 お手数ですが、ご教授いただきたく宜しくお願い申し上げます。

  • C#(VS2013)のWorkerスレッド

    Q1) C#(VS2013)のForm上に配置しました、mouseClick(...)を、Workerスレッドから 割込み起動する方法はありますか? mouseClick(...)とWorkerスレッドに関しましては、下記のコードを参照ください。 ================== private void mouseClick(object sender,MouseEventArgs e) { //これも動作する、1ピクセル単位で描画 Invalidate(); //Invalidate()は、mouseClickルーチンを抜けてからその効力を発行 } public class Worker { // Form1 fm1=new Form1(); int CNT=0; static System.Diagnostics.Stopwatch sw=new System.Diagnostics.Stopwatch(); public void DoWork() { while(!_shouldStop) { //JOB======== while(Form1.flag_DRAWSRT==true && CNT<400) ; //CNT<400必要 //========================= ここに、mouseClick(...)を起動するコードを書きます(その質問です) //========================= //Form1.flag_DRAWSRT=true; //fm1.pictureBox1_drawA(); Thread.Sleep(100); //fm1.OnPaintA(); //=========== if(CNT==0) { sw.Reset(); sw.Start(); } if(CNT>400) { _shouldStop=true; Console.WriteLine("Period[ms]="+sw.Elapsed); } CNT++; } Console.WriteLine("worker thread: terminating gracefully."); } public void RequestStop() { _shouldStop = true; } public void RequestStart() { _shouldStop = false; } // Volatile is used as hint to the compiler that this data // member will be accessed by multiple threads. private volatile bool _shouldStop=false; }//public class Worker { 以上、宜しくお願いします。

  • Thread.Abortメソッド後の処理について

    Thread.abortメソッドについて分からないことがあったので,助言が頂けると嬉しいです. Thread.Abort () を発生させると,通常そこでスレッドが終了するということなので,その後のスレッド内の処理はスルーされると思っていたのですが,下記コードですとその後の pictureBox1.Image = null;も実行されている様です. mainでスレッド作成→threadAの停止になると考えていたのですが,delegate内では反映されないのでしょうか? Thread thread_a; //スレッド delegate void Del(); private void main(object sender, EventArgs e) { //スレッドを開始 thread_a = new Thread(new ThreadStart(threadA)); thread_a.Start(); } private void threadA() { new Thread(new ThreadStart(delegate { Invoke((Del)delegate { thread_a.Abort(); //画像を消去する pictureBox1.Image = null; }); })).Start(); }

  • C#について

    using System; class AddressBook: PhoneBook { private string address; public AddressBook() : base() { address=""; } public void Input() { base.Input(); Console.Write("住所?"); string address=Console.ReadLine(); } public void Writes() { base.Write(); Console.WriteLine("住所:{0}",address); } } class kadai62 { public static void Main() { Console.Write("電話帳に入力する人数を入れてください:"); int n = int.Parse(Console.ReadLine()); AddressBook[] pb = new AddressBook[n]; int i; for (i = 0; i < pb.Length; i++) { pb[i] = new AddressBook(); Console.WriteLine("{0}番目を入力してください.", i+1); pb[i].Input(); } Console.WriteLine(); while(true) { Console.Write("どこから探しますか?[1:氏名,2:自宅電話,3:携帯電話,0:終了] "); int t = int.Parse(Console.ReadLine()); if (t == 0) break; Console.Write("探す文字列は?"); string s = Console.ReadLine(); for (i = 0; i < pb.Length; i++) { if (pb[i].Search(t, s)) pb[i].Writes(); } } } } このプログラムで public void Writes() { base.Write(); Console.WriteLine("住所:{0}",address); } のaddressが出力されません・・どうすれば 出力されますか?

  • スレッドの中断についての質問

    現在、C#でプログラミングを開発しております。初心者ですので、よろしくお願いします。 public delegate void MyMethod(); private Thread t1=null ; public void btn_Download_Click(object sender, EventArgs e) //Go! {   Thread t1 = new Thread(new ThreadStart(DownloadThread_HTTP));   t1.IsBackground = true; t1.Start(); } public void DownloadThread_HTTP() // download Thread { MyMethod DOWNLOAD_with_HTTP = new MyMethod(this.DOWNLOAD_with_HTTP); this.BeginInvoke(DOWNLOAD_with_HTTP); } public void DOWNLOAD_with_HTTP() { ...... } private void button2_Click(object sender, EventArgs e) //pause button { t1.Join(); } コードは 以上です。コンパイラは大丈夫ですけど、プログラムを実行するときに button2をクリックすると NullReferenceException例外エラーが出ます。t1の値がNullのためっていうことをわかりますけど、どうやれば t1の値がNullにならないのですか? ご教授ください、お願いいたします。

  • C#の変数の範囲

    C#の変数の範囲 質問させてください。 以下は、ネットに掲載されていたC#の問題です。 ~ここから~ 下記のC#のコードを実行した場合、"Hello World!"と二行表示されます。 using System; class Program { static void Main(string[] args) { string s = "Hello"; Action a = () => Console.WriteLine(s); s += " World!"; a(); Console.WriteLine(s); } これを一行目だけ"Hello"と表示される場合、 Action a = () => Console.WriteLine(s);をどう書き換えればよいでしょうか。 1. Action a = () => Console.WriteLine("Hello!"); 2. Action<string> a = (s) => Console.WriteLine(s); 3. Action a = () => Console.WriteLine(t - " World!"); 4. string t = s; Action a = () => Console.WriteLine(t); 5. Action a = () => { string t = s; Console.WriteLine(t); }; ~ここまで~ 正解は4だそうですが、「何故」そうなるかがわかりません。 汗 私としては、1.4.も題意を満たす気がするのですが・・・。 お知恵をお貸しください。 出展 http://www.atmarkit.co.jp/fdotnet/extremecs/extremecs_07/extremecs_07_10.html

  • C# マルチスレッドにおける例外処理

    下記のようなデリゲートを利用したマルチスレッドのプログラムを組みました。 しかし、マルチスレッド内で例外がおきても、正常にプログラムが終了してしまいます。 (try-catchでも例外を捕捉できません) マルチスレッドプログラムにおいて、例外を捕捉するにはどうすれば、いいのでしょうか? using System; using System.Threading; class Class1 { delegate void delg(); public static void Main() { delg d = new delg(multi); d.BeginInvoke(new AsyncCallback(call), null); //マルチスレッド開始 System.Threading.Thread.Sleep(500); //マルチスレッドで例外を強制的に投げているので、 //ここまでたどり着く前にアプリケーションが落ちるはず。 //しかし、実際には正常終了。 Console.WriteLine("メインメソッド 正常終了"); } public static void multi() { Console.WriteLine("マルチスレッドで実行中"); throw new Exception(); //例外を強制的に投げる。 } public static void call(IAsyncResult ar) { Console.WriteLine("コールバックメソッド実行"); } }