Синхронизация потоков - C# (206103)

Узнай цену своей работы

Формулировка задачи:

Здравствуйте! Я понимаю, что подобные вопросы уже много раз задавались, но перечитав подобные темы та и другую литературу, так и не смог найти решения для моей задачи. Вообщем в от в чем дело! У меня есть 2 потока. Первый это основной поток, который запускается при запуске программы и второй, который я создаю сам. Проблема в том, что я так и не понял, как правильно их синхронизировать. У меня есть pictureBox, который я передаю в свой поток, который в свою очередь передвигает ее по канве. Проблема в том, что выбивает такову ошибку "Недопустимая операция в нескольких потоках: попытка доступа к элементу управления 'pictureBox1' не из того потока, в котором он был создан." Прошу дописать в мой код нужные строчки, которые помогут программе заработать и обьяснить, что они означают более детально. Заранее спасибо!! Код осн. программы:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.Timers;
 
namespace  LB_03
{
    public partial class Form1 : Form
    {
        PictureBox img = new PictureBox();
        public Form1()
        {           
            InitializeComponent();

        }
 
        private void Form1_Load(object sender, EventArgs e)
        {
            img = pictureBox1;
 
        }
 
        private void button1_Click(object sender, EventArgs e)
        {
            Thread MainThrd = Thread.CurrentThread;
            EnemyThread t1 = new EnemyThread(img);
            t1.thrd.IsBackground = true;
            t1.Priority = ThreadPriority.Lowest;
            t1.thrd.Join();
 
        }
 
        private void timer1_Tick(object sender, EventArgs e)
        {
        }
 
        private void pictureBox1_Click(object sender, EventArgs e)
        {
 
        }
 
        }
    }
Код потока:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;
using System.Drawing;

namespace LB_03
{
    class EnemyThread
    {
        public PictureBox img;
        public Thread thrd;
 
        public EnemyThread(PictureBox img)
        {
            this.img = img;
            thrd = new Thread(new ThreadStart(this.run));
            thrd.Start();
        }
 
        void run()
        {
            for (int i = 0; i < 40; i += 1)
            {
                    Thread.Sleep(100);
                    img.Location = new Point(img.Location.X + 10, img.Location.Y);
            }
 
        }
 
        public ThreadPriority Priority { get; set; }
    }
}

Решение задачи: «Синхронизация потоков»

textual
Листинг программы
namespace LB_03
    {
        public partial class Form1 : Form
        {
            public Form1()
            {
                InitializeComponent();
            }
 
            private void button1_Click(object sender, EventArgs e)
            {
                EnemyThread t1 = new EnemyThread(pictureBox1);
                t1.Start();
            }
 
        }
    }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4 из 5
Похожие ответы