関連記事
- なんと!今週の土曜日も仕事してますた.来週の土曜日も仕事臭い.TCPソケット通信をゴリゴリ書いてる 【2025年08月30日(土)】
- 【ChatGPT o4】祝日なのに仕事ーバテすぎー今夜こそ絶命だーモルモルモル 【2025年03月20日(木)】
- 【#CSharp】制御系が動き出したべ 【2025年02月20日(木)】
- 【#CSharp】ひっさしぶりにガッツリなC#案件をやっているぞー 【2025年02月19日(水)】
- 今週もひたすらモノ書き #JAVA 祭りがまだまだ続く そろそろC#を書かせろー 【2024年12月04日(水)】
ワーカースレッドループ中で
Windowsフォームのコントロールのプロパティをいじくると
たとえば、ラベルのTextプロパティに文字を突っ込んだり
有効ではないスレッド間の操作: コントロールが作成されたスレッド以外のスレッドからコントロール ‘label1’ がアクセスされました。 |
Windowsコントロールのプロパティ操作や、メソッド呼び出しは
主スレッド行うのが原則で
他のスレッドからの、操作は動作保証しない感じ
でも、やっぱり、ワーカースレッドから
コントロールのプロパティ、いじりたいと思うのは、人情
そのときは、Control.Invokeメソッドを使うことにより
スレッド間の処理調停をうまい具合にやってくれます
サンプルは以下のように…
今回は、スレッドタイマークラスを使ってみました
public partial class Form1 : Form
{
private System.Threading.Timer m_tmr; //スレッドタイマ
private bool fl = true; //スレッド管理フラグ
public Form1()
{
InitializeComponent();
TimerCallback timerDelegate = new TimerCallback(TmrLabelText); //スレッドタイマのインスタンス生成
m_tmr = new System.Threading.Timer(timerDelegate, null , 0, 50);
}
private void Form1_FormClosed(object sender, FormClosedEventArgs e)
{
fl = false; //後始末
for(int i = 0; i < 100; i++) //イベントが貯まっている可能性があるので
{
Application.DoEvents();
Thread.Sleep(1);
}
}
//---------------------------------------------
//スレッドタイマを利用したテキストの文字列代入
//
//---------------------------------------------
public void TmrLabelText(object o)
{
if (fl == true)
{
MySetControlText(label1, "aaa"); //デリゲート本体を呼び出す
}
}
//-------------------------------------------
//ラベル向け文字列セットデリゲート
//
//-------------------------------------------
private void MySetControlText(Label l, string t)
{
if (l.InvokeRequired == true)
{
deli_MySetControlText d = new deli_MySetControlText(MySetControlText);
this.Invoke(d, new object[] {l, t});
}
else
{
l.Text = t;
}
}
delegate void deli_MySetControlText(Label l, string t); //デリゲート型の定義
}
[/csharp]
コメント
【大地震】カムチャツカ半島沖合で地震 マグニチュード7.5と推定(25/9/13)
台風一過なのに今日も猛暑予想.秋が来ないぞい
【霧島山】新燃岳が噴火 噴煙高度火口上5500m(25/8/28)
日産「GT-R」生産終了 スポーツカーの開発環境 厳しさ増す
火球か?隕石か?「夜なのに明るく」「カメラが真っ白になるほどの光」九州や西日本各地で目撃あいつぐ 空気の振動も観測
ひょっとして,大規模にやらかしてました?ぎんゆぅ~さん,落ちてた模様(爆