最新の更新情報

2012年2月
« 1月    
 1234
567891011
12131415161718
19202122232425
26272829  

本ブログのURL

qrcode.png

雨雲の動き

お天気

 
 
吟遊詩人の戯言 内専用の記事検索...
 
 

ワーカースレッドからWindowsコントロールのプロパティをいじりたいとき


キーワード(クリックで関連記事が読めます) →

関連記事



 
 

ワーカースレッドループ中で
Windowsフォームのコントロールのプロパティをいじくると
たとえば、ラベルのTextプロパティに文字を突っ込んだり


有効ではないスレッド間の操作:
コントロールが作成されたスレッド以外のスレッドからコントロール 'label1' がアクセスされました。


なんて、エラーが出ちゃいます

Windowsコントロールのプロパティ操作や、メソッド呼び出しは
主スレッド行うのが原則で
他のスレッドからの、操作は動作保証しない感じ

でも、やっぱり、ワーカースレッドから
コントロールのプロパティ、いじりたいと思うのは、人情

そのときは、Control.Invokeメソッドを使うことにより
スレッド間の処理調停をうまい具合にやってくれます

サンプルは以下のように...
今回は、スレッドタイマークラスを使ってみました

C#:
  1. public partial class Form1 : Form
  2. {
  3.     private System.Threading.Timer m_tmr;         //スレッドタイマ
  4.     private bool fl = true;       //スレッド管理フラグ
  5.  
  6.     public Form1()
  7.     {
  8.         InitializeComponent();
  9.  
  10.         TimerCallback timerDelegate = new TimerCallback(TmrLabelText);    //スレッドタイマのインスタンス生成
  11.         m_tmr = new System.Threading.Timer(timerDelegate, null , 0, 50);
  12.  
  13.     }
  14.  
  15.     private void Form1_FormClosed(object sender, FormClosedEventArgs e)
  16.     {
  17.         fl = false;      //後始末
  18.  
  19.         for(int i = 0; i <100; i++) //イベントが貯まっている可能性があるので
  20.         {
  21.             Application.DoEvents();
  22.             Thread.Sleep(1);
  23.         }
  24.  
  25.     }
  26.  
  27.     //---------------------------------------------
  28.     //スレッドタイマを利用したテキストの文字列代入
  29.     //
  30.     //---------------------------------------------
  31.     public void TmrLabelText(object o)
  32.     {
  33.         if (fl == true)
  34.         {
  35.             MySetControlText(label1, "aaa");        //デリゲート本体を呼び出す
  36.         }
  37.     }
  38.  
  39.     //-------------------------------------------
  40.     //ラベル向け文字列セットデリゲート
  41.     //
  42.     //-------------------------------------------
  43.     private void MySetControlText(Label l, string t)
  44.     {
  45.         if (l.InvokeRequired == true)
  46.         {
  47.             deli_MySetControlText d = new deli_MySetControlText(MySetControlText);
  48.             this.Invoke(d, new object[] {l, t});
  49.         }
  50.         else
  51.         {
  52.             l.Text = t;
  53.         }
  54.     }
  55.  
  56.     delegate void deli_MySetControlText(Label l, string t);  //デリゲート型の定義
  57. }



 
 
 
 

コメントを残す

  

  

  

You can use these HTML tags

<a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong> <img localsrc="" alt="">