Синхронизация потоков - 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(); } } }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д