如何使用Thread移动PictureBox?

时间:2012-10-07 04:15:35

标签: c# multithreading picturebox

我正在学习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);
            }   
        }
    }
}

2 个答案:

答案 0 :(得分:6)

您只能从创建控件的线程更新控件。控件确实有一个Invoke方法,您可以从另一个线程调用。此方法接受一个委托,指定您要在控件的线程上执行的工作:

var updateAction = new Action(() => { pictureBox1.Location = new Point(x,y); });
pictureBox1.Invoke(updateAction);

答案 1 :(得分:4)

你必须Invoke它。由于[显而易见]原因,您无法访问由其他线程创建的控件,因此您必须使用委托。几个类似的SO问题:

  1. How to update the GUI from another thread in C#? 111 upvotes
  2. Writing to a textBox using two threads
  3. How to update textbox on GUI from another thread in C#
  4. Writing to a TextBox from another thread?
  5. 如果您查看第一个链接,Ian的好答案将演示如何在.Net 2.0和3.0中执行此操作。或者您可以向下滚动到下一个答案Marc's,它将以最简单的方式向您展示如何操作。

    <强>代码:

    //worker thread
    Point newPoint = new Point(someX, someY);
    this.Invoke((MethodInvoker)delegate {
    pictureBox1.Location = newPoint;
    // runs on UI thread
    });