3

私はC#でスレッドを学習しているので、最初のプログラムは移動する2つの画像になります。しかし、問題は、スレッドで新しいポイントを実行しようとするとエラーが発生することです。

これが私のコードです:

namespace TADP___11___EjercicioHilosDatos
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        int x = 0;
        int y = 0;

        private void Form1_Load(object sender, EventArgs e)
        {
            Thread Proceso1 = new Thread(new ThreadStart(Hilo1));
            Proceso1.Start();
        }

        public void Hilo1()
        {   
            while (true) 
            {
                x = pictureBox1.Location.X - 1;
                y = pictureBox1.Location.Y;
                pictureBox1.Location = new Point(x, y);
            }   
        }
    }
}
4

2 に答える 2

6

コントロールを更新できるのは、コントロールが作成されたスレッドからのみです。コントロールにはInvoke、別のスレッドから呼び出すことができるメソッドがあります。このメソッドは、コントロールのスレッドで実行する作業を指定するデリゲートを取ります。

var updateAction = new Action(() => { pictureBox1.Location = new Point(x,y); });
pictureBox1.Invoke(updateAction);
于 2012-10-07T04:36:31.083 に答える
4

あなたはそれを呼び出す必要があります。[明らかな]理由により、別のスレッドによって作成されたコントロールにアクセスできないため、デリゲートを使用する必要があります。いくつかの同様のSO質問:

  1. C#の別のスレッドからGUIを更新するにはどうすればよいですか?111賛成
  2. 2つのスレッドを使用してtextBoxに書き込む
  3. C#の別のスレッドからGUIのテキストボックスを更新する方法
  4. 別のスレッドからTextBoxに書き込みますか?

最初のリンクを確認すると、Ianのすばらしい答えが、.Net2.0および3.0でこれを行う方法を示しています。または、次の答えであるMarc'sまでスクロールして、最も簡単な方法でそれを行う方法を示します。

コード:

//worker thread
Point newPoint = new Point(someX, someY);
this.Invoke((MethodInvoker)delegate {
pictureBox1.Location = newPoint;
// runs on UI thread
});
于 2012-10-07T04:45:39.517 に答える