Бегущие кнопки в потоке - исправить код - C#
Формулировка задачи:
Есть листинг программы и форма, на форме 3 кнопки, которые в случайном порядке перемещаются по оси х и 3 кнопки управления, старт, стоп и пауза. Кто может подсказать, почему у меня при нажатии на кнопку старт не перемещаются кнопки.
using System; using System.Collections.Generic; using System.ComponentModel; using System.Data; using System.Drawing; using System.Linq; using System.Text; using System.Windows.Forms; using System.Threading; namespace WindowsFormsApplication3 { public delegate void HelperToCall(Button btn);//ПОмошник для манипулирования объектами из разных потоков, тк //объкты созданные в одном вотоке не могут использоваться в других, поетому исп делегаты тк они асинхронны public partial class Form1 : Form { Thread t1;//Поток для движения первой кнопки Thread t2;//-=- Thread t3;//-=- HelperToCall helper; Random r;// отвечает за произвольную скорость движения кнопок public Form1() { InitializeComponent(); HelperToCall helper = new HelperToCall(Motion); r=new Random(); } private void Form1_Load(object sender, EventArgs e) { } private void Start_btn_Click(object sender, EventArgs e) { ((Button)sender).Enabled=false; if (t1 != null) { t1.Resume(); t2.Resume(); t3.Resume(); return; } t1 = new Thread(Movement1); t2 = new Thread(Movement2); t3 = new Thread(Movement3); t1.IsBackground = t2.IsBackground = t3.IsBackground = true; t1.Start(); t2.Start(); t3.Start(); } void Motion(Button button) { button.Location = new Point(button.Location.X + r.Next(0,10), button.Location.Y); } void Movement1() { while (true) { Thread.Sleep(r.Next(5,40)); Invoke(helper,First_btn);//Инвок, метод, влезающий в другие потоки } } void Movement2() { while (true) { Thread.Sleep(r.Next(5,40)); Invoke(helper, Second_btn); } } void Movement3() { while (true) { Thread.Sleep(r.Next(5,40)); Invoke(helper, Third_btn); } } private void Pause_btn_Click(object sender, EventArgs e) { Start_btn.Enabled = true; if (t1 != null) { t1.Suspend(); t2.Suspend(); t3.Suspend(); } } private void Stop_btn_Click(object sender, EventArgs e) { Pause_btn_Click(sender, e); } private void Reset() { First_btn.Location = new Point(13, First_btn.Location.Y); Second_btn.Location = new Point(13, Second_btn.Location.Y); Third_btn.Location = new Point(13, Third_btn.Location.Y); } } }
Решение задачи: «Бегущие кнопки в потоке - исправить код»
textual
Листинг программы
public Form1() { InitializeComponent(); r=new Random(); //уникальный метод для любого потока ParameterizedThreadStart thFunc = x => { Control c = x as Control; while (true) { c.Invoke(new Action<Control>(btn => { btn.Location = new Point(r.Next(20, 400), (btn as Control).Location.Y); }), c); } }; //инициализируем потоки только один!! раз t1=new Thread(thFunc); t2=new Thread(thFunc); t3=new Thread(thFunc); } private void Start_btn_Click(object sender, EventArgs e) { ((Button)sender).Enabled=false; Pause_btn.Enabled=true; //запускаем поток, передам ему кнопку t1.Start(First_btn); t2.Start(Second_btn); t3.Start(Third_btn); } private void Stop_btn_Click(object sender, EventArgs e) { //есть специальная ф-ция для остановки потока t1.Abort(); t2.Abort(); t3.Abort(); Start_btn.Enabled =true; Pause_btn.Enabled=false; } private void Pause_btn_Click(object sender, EventArgs e) { //тут убирается ставшая лишней проверка t1.Suspend(); t2.Suspend(); t3.Suspend(); }
ИИ поможет Вам:
- решить любую задачу по программированию
- объяснить код
- расставить комментарии в коде
- и т.д