• 締切済み

Visual c# スレッド

プログラム初心者です。 Visual c#にてスレッド関数を使ったプログラムを見よう見まねで 作りました。 スタートボタンを押すとピクチャーボックスの位置が 左から右へ移動し、ストップボタンを押すと止まる。 ピクチャーボックスの位置をテキストボックスに表示する。 というプログラムのつもりです。 デバックの状態でスタートボタンを押すとエラーメッセージが出て テキストボックスに位置を書き込むの関数のところが緑色にハイライトされます。エラーの内容は「有効でないスレッド間の操作」とありますが、どうしたら良いのか分かりません。 エラーの直し方を教えてください。 プログラムコードは以下です。 using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Text; using System.Windows.Forms; using System.Threading; namespace bit_map_08._1._ { public partial class Form1 : Form { private Thread thread; static private int Position = 0; static private int i; static bool BtnOnFig; public Form1() { InitializeComponent(); } private void Form1_Load(object sender, EventArgs e) { thread = new System.Threading.Thread(newSystem.Threading.ThreadStart(MainThread)); thread.Start(); } private void PointMove() { if (i < 300) { i = i + 1; Position = Position + i; textBox1.Text = Convert.ToString(Position); pictureBox1.Left = (Position); } if (i == 300) { i = 0; } } private void MainThread() { while( true ) { Thread.Sleep(100); if (BtnOnFig == true) { PointMove(); } } } private void button1_Click(object sender, EventArgs e) { BtnOnFig = true; } private void button2_Click(object sender, EventArgs e) { BtnOnFig = false; } } }

みんなの回答

  • btob
  • ベストアンサー率22% (147/663)
回答No.1

C#のスレッドには詳しくないですが、VC++でも、この方法はプログラムは停止します。コントロールは、スレッドごとの管理になっているので、子スレッドから別スレッド管理下のコントロールを操作すると、存在しないコントロールを操作することになるので、プログラムが飛びます。 VC++で子スレッドから、親スレッド管理下のコントロールを操作するときは、子スレッドから親スレッドにメッセージを送ります。親スレッドは、そのメッセージを受信したら、コントロールを操作するようにさせています。 おそらく、C#でも同じ原因で飛んでいると思いますし、同じ解決方法がとれる思います。 後は、C#に詳しい方にお任せします。

tomasbenso
質問者

お礼

回答ありがとうございます。 このプログラムのスレッドに親と子があることを知りませんでした。 テキストボックスやピクチャーボックスなどツールから選んで フォームに貼り付けるものは自前のスレッド以外のスレッドで 管理されてるのどしょうか? お時間がありましたらVC++の方法でも良いので聞かせてください。 よろしくお願いします。

関連するQ&A